2013-03-18 1 views
13

GSON을 사용하여 Android 애플리케이션에서 객체 계층 구조를 직렬화 및 역 직렬화하기 시작했습니다.GSON 역 직렬화 후 객체 생성 완료

일부 개체에는 출력 JSON의 일부로 직렬화하지 않으려는 개체에 대한 참조이기 때문에 transient으로 표시해야하는 멤버가 있습니다 (또는 다른 방법으로 GSON 주석을 사용하여 직렬화되지 않도록해야합니다) 끈. 이러한 참조는 다른 수단으로 별도로 작성해야하는 객체에 대한 참조입니다.

일단 구조가 자바 객체로 역 직렬화되면, 어느 시점에서 그 참조를 채워야합니다. 아마도 일련의 setXXX() 형식 메서드를 사용하여이 작업을 쉽게 수행 할 수 있지만 완료 될 때까지 해당 개체는 불완전한 상태에 있습니다. 그러므로 내가 궁금해하는 것은 이것에 대한보다 견고한 접근법이 있는지 아닌지입니다.

방법은 지금까지의 생각 :

  • 이 객체가 던져 되세요 RuntimeException (또는 더 적합 무언가)가 불완전한 상태 인 경우; 즉, 일부 초기화 메소드가 호출되지 않은 경우 일부 작업을 수행하라는 메시지가 표시됩니다.

  • 직렬화 가능 비트를 개별 데이터 모델 오브젝트로 분리하십시오. 즉, 직렬화 할 수없는 항목을 제거하십시오. GSON 역 직렬화 후, 컴포지션의 데이터 객체를 사용하여 '실제'객체를 구축하십시오. 이것은 다소 GSON을 사용하는 편리함을 무너 뜨리는 것 같습니다.

  • GSON에 대한 사용자 정의 디시리얼라이저를 작성하여 해당 객체의 특수 작성을 처리하십시오. 나는 일반적으로 직렬화 할 필요가 아무것도 내 응용 프로그램을 설계 할 때문에

답변

5

나는 것, 두 번째 방법을 것입니다 당신이 원하는 경우/역 직렬화 정말 그냥 평범한 오래된 데이터 또는 POJO를합니다. 원하는대로 직렬화 API를 사용자 정의/구성해야 할 필요가있는 경우, 직렬화되는 API를 추가 구성 할 필요가 없으므로 직렬화되는 것을 단순화하는 경향이 있습니다.

그래서 좀 더 복잡한 데이터 모델을 가지고 있는데, 그 중 일부는 직렬화/역 직렬화 할 필요가 없습니다. 그런 다음 직렬화/직렬화에 참여할 개념적으로 분리 된 데이터 모델로 POJO 집합을 추출합니다. 비 직렬화. 그러면 두 데이터 모델을 매핑하는 데 별도의 단계가 필요하지만 대개 간단합니다.

세 번째 방법이 선호되는 경우에는 the Instance Creator feature을 메모하십시오. 그러면 deserialization 프로세스를 사용자 지정하는 데 유용한 또 다른 도움이 될 수 있습니다.

+0

많은 감사. 나는이 두 번째 접근법을 취해야한다고 생각한다. JSON 출력이 현재 실제 클래스 구현과 매우 밀접하게 결합되어 있고, 또한 버전 관리에 관심이 있기 때문이다. JSON 파일이 최신 애플리케이션에로드되면 지저분해질 수있다. 클래스 구조가 변경된 vesion). 지속성을 위해 애플리케이션 클래스를 '모델'클래스의 트리로 매핑하는 것은 모든 것을 해결하는 좋은 방법 인 것으로 보인다.어리석은 질문이지만 실제 작업 클래스와 데이터 모델 클래스를 구별하기 위해 사용하는 용어는 무엇입니까? – Trevor

+0

ViewModel, PersistenceModel 또는 SerializedModel, JsonModel 또는 IntegrationModel 또는 ServiceModel 또는 다른 것일 수 있습니다. –

8

체크 아웃 https://github.com/julman99/gson-fire

는 내가 그 후 직렬화 및 사후 직렬화 같은 경우를 처리하기 위해 GSON를 확장하는 라이브러리 만들어졌다

또한 그것은 내가 GSON으로 시간이 지남에 필요 한 많은 다른 멋진 기능을 가지고 있습니다 .