2012-12-05 2 views
0

다음과 같은 load()/save() 함수를 사용하여 직렬화하려고하는 Expression 클래스가 있습니다. 잘 작동하려면, 코드와 Expression 클래스를 약간 변경 한 후에 in.readObject()을 호출하면 ClassCastException이 throw됩니다. 오류 메시지는 다음과 같습니다 java.lang.ClassCastException가가 : java.lang.String의 날에를 java.io.ObjectStreamClassJava Serializable failure

+0

Android Java 개발에서 뭔가 다른 것이 아니라면이 객체에 대해 사용자 고유의 직렬화 알고리즘을 구현해야 할 필요는 없다고 생각합니다. 내가 놓친 게 있니? – thatidiotguy

+0

저장된 직렬화 된 개체를로드하려고합니까? Expression 클래스 정의를 변경하기 전에? – femtoRgon

+0

이전에 저장된 내용이 삭제되었습니다. @thatidiotguy 내 알고리즘을 구현한다는 것은 무엇을 의미합니까? 메신저 그냥 Serializable 구현 추가. – aviran

답변

0

캐스트 할 수없는,이 String으로 바이너리 데이터를 저장하는 아주 나쁜 느낀다. 보다 안정적인 방법으로 ObjectOutputStream의 바이너리 출력을 저장하려고합니다. 문자열 형식의 접근 방식을 계속 사용하려면 Base64 인코딩을 사용해보십시오. 항상 안전합니다. 이 UID가 클래스 경로의 클래스가와 호환되는지 확인하는 데 사용됩니다

private static final long serialVersionUID = 3L; 

: 나는 문제로 볼 수 있습니다 무엇


는 정적 상수로 serialUID 직접 정의이다 입력 객체의 클래스. 그래서 내가 의심하는 것은 serialVersionUID를 변경하지 않고 클래스를 수정 한 것입니다. 즉, ObjectInputStream은 그것이 호환성이 있다고 생각하지만, 여전히 이전 데이터로 작업하고 있습니다. 이전 데이터를 없애고 새로운 save() 호출로 다시 시작하십시오.


당신은 Input뿐만 아니라 직렬화 있는지 확인이 있습니까? 그 클래스의 UID가 손상되지 않았습니까?

+0

문자열을 사용하면 지금 할 수있는 일입니다 ... 문제는 일부 오류가 발생하는 클래스의 수정 인 것 같습니다. 문자열의 사용이 잘 작동 – aviran

+0

내 업데이트를 확인하십시오. –

+0

serialVersionUID를 여러 번 수정하려고 시도했지만 효과가 없습니다. 오래 전에 삭제 된 그 오래된 것. 디버그를 통해 새로운 데이터가 저장되고 있음을 알 수 있지만 readObject()가 예외를 throw합니다. – aviran

0

클래스 멤버의 필드에서 NULL 값이 직렬화 가능으로 보이지 않습니다. 모든 클래스 멤버가 실제 메모리를 가지고 있는지 확인하면 실패하지 않습니다.