2013-07-28 2 views
3

참고 :인해 SO에서이 같은 질문의 부족으로, 나는 Q &객체 일렬는

직렬화 나 자신까지를 넣어하기로 결정했습니다 개체 (ObjectOutputStreamObjectInputStream 사용)는 나중에 사용하기 위해 deserialize 할 수있는 데이터로 Java Object의 인스턴스를 저장하는 방법입니다. 이는 데이터를 비 직렬화하는 데 사용되는 Class이 동일하지 않은 경우 (소스 코드 변경, 프로그램 업데이트) 문제와 불만을 야기 할 수 있습니다.

따라서 ObjectClass의 업데이트/다운 그레이드 버전으로 직렬화 및 역 직렬화 할 수 있습니까?

+2

[객체 직렬화 사양의 직렬화 가능 객체 버전 관리] (http://docs.oracle.com/javase/7/docs/platform/serialization/spec/version.html)를 읽어야합니다. – EJP

+0

개체를 'JSON', 'XML'등으로 저장하는 것은 모든 언어에서 일반적인 방식이지만이 게시물은 Java 및 사용 가능한 클래스를 대상으로 작성되었습니다. 제목에는 Java가 포함되어야합니다. –

+2

질문 제목에 태그를 추가하지 마십시오. [질문에 제목에 "태그"가 포함되어야합니까?] (http://meta.stackexchange.com/q/19190/182862). –

답변

2

역 직렬화 할 수있는 객체를 직렬화하는 몇 가지 일반적인 방법이 있습니다.

1 스토어에게 인스턴스를 다시하는 데 필요한 모든 필드를 저장하도록 설계 importexport 방법을 사용하여 JSON 형식의 데이터입니다. 버전이 너무 낮 으면 업데이트 알고리즘을 호출 할 수있는 version 키를 포함하면 이전 버전과 호환 될 수 있습니다. 일반적인 라이브러리는 Google Gson 라이브러리로, JSON 파일을 일반적으로 편집 할 수있을뿐만 아니라 JSON에서 Java 객체를 나타낼 수도 있습니다.

2. 위의 방법과 비슷한 방법으로 내장 된 Properties 클래스를 사용하십시오. Properties 객체는 나중에 일반 Java Properties 파일로 작성된 스트림 (store())을 사용하여 저장하거나 XML (storeToXML())에 저장하여 사용할 수 있습니다. JSON, XML에 저장하거나, 속성 파일이 너무 복잡하거나이 켜지지되지 중 하나입니다 때로는 단순한 객체가 쉽게 장소에서 키 - 값 쌍으로 표현 될 수

3. (과잉 하나는 말할 수) . 이 경우 객체를 직렬화하는 효과적인 방법은 String 일 수 있고 Object (HashMap<String,Object>) 일 수있는 키 - 값 쌍을 포함하는 HashMap 객체를 직렬화하기 위해 ObjectOutputStream 클래스를 사용할 수 있습니다. 이 기능을 사용하면 객체의 모든 필드를 저장할 수있을뿐만 아니라 다양한 기능을 제공하면서 version 키를 포함하여 저장할 수 있습니다.

참고 : ObjectOutputStream에 대한 지속성 스토리지를 사용하여 객체를 직렬화하는 것은 일반적으로 나쁜 규칙으로 간주되어 있지만,이 방법으로 오랫동안 클래스의 소스 코드를 동일하게 유지로 사용할 수있다.

또한 버전에 대한 참고 : 클래스 변경 안전하게으로 오랫동안 ObjectOutputStream를 사용하여 직렬화를 방해하지 않고 할 수 그들이 호환 변화이기 때문에. Versioning of Serializable Objects chapter of the Object Serialization Specification에서 언급 한 바와 같이 :

호환 변화는 클래스와 발신자 사이의 계약 에 영향을 미치지 않는 변화이다.

+0

왜'readObject'와'writeObject' 메소드의 사용법을 보여주는 방법이 없습니까? –

+0

@LuiggiMendoza'readObject'와'writeObject'를 사용하는 것은'ObjectOutputStream' 클래스를 언급함으로써 암시되는 것입니다. 쉽게 찾을 수 있도록 Javadocs에 대한 링크를 추가했습니다. –

+0

최종 문장이 잘못되었습니다. 'ObjectOutputStream'은 [사양에 언급 된 제약 조건] (http://docs.oracle.com/javase/7/docs/platform/serialization/spec/version.html)을 준수하는 한 * 사용할 수 있습니다. * – EJP