2014-03-30 3 views
1

Doodle이라는 객체가 있는데, 문자열로 직렬화합니다. 개체를 deserialize하려고 할 때 문제가 발생합니다. 오류는 다음과 같습니다. java.io.InvalidClassException : java.util.ArrayList; 로컬 클래스 호환 : 스트림 classdesc 용의 serialVersionUID = 8664875232659988799 = 8683452581122892189java.io.InvalidClassException : 문자열에서 객체로의 직렬화 실패 java

방법은 직렬화 및 역 직렬화하는 로컬 클래스의 serialVersionUID는 다음과 같다 :

public static String serDoodle(Doodle dood){ 
    String serializzato = null; 
    try { 
     ByteArrayOutputStream bo = new ByteArrayOutputStream(); 
     ObjectOutputStream so = new ObjectOutputStream(bo); 
     so.writeObject(dood); 
     so.flush(); 
     serializzato = bo.toString(); 
     so.close(); 
     bo.close(); 
    } catch (Exception e) { 
     System.out.println(e); 

    } 
    return serializzato; 

} 
public static Doodle deserDoodle(String deserializza){ 
    Doodle dod = new Doodle(); 


    try { 
     byte[] b = deserializza.getBytes(); 
     ByteArrayInputStream bi = new ByteArrayInputStream(b); 
     ObjectInputStream si = new ObjectInputStream(bi); 
     dod=(Doodle) si.readObject(); 
     si.readObject().getClass(); 
     si.close(); 
     bi.close(); 
    } catch (Exception e) { 
     System.out.println("deserDoodle "+e); 

    } 
    return dod; 


} 

제가 다른 직렬화 (그러나 다른 변수)와 동일한 방법을 사용하여 유형의 개체 및 그 중 하나를 크게 작동합니다. 문제가 어디인지 이해할 수 없습니다.

답변

1

나는 문자열로 직렬화 그것은 아니, 확인되지

괜찮습니다. String은 이진 데이터의 컨테이너가 아닙니다. 바이트 배열과 String 사이의 왕복은 손실로 보장되지 않습니다. 이러지 마. byte[]을 사용하거나 최소한 Base64로 인코딩하십시오.

+0

그러면 문자열이 길어질수록 더 많은 데이터가 손실됩니다. – user3457185

+0

@ user3457185 평소와 마찬가지로 '그렇게 당신이'질문을, 나는 그런 종류의 아무것도 말했다. 바이너리 데이터의 컨테이너로서'String'을 사용하는 것이 좋지 않다고 말했습니다. 기간. 길이와 아무 관련이 없습니다. – EJP