2012-04-20 4 views
3

개체의 특정 필드를 serialize하려면. 그리고 deserialization 프로세스가 진행되는 동안 적절한 생성자를 통해 객체를 다시 구성해야합니다. 이것이 가능한가 ? 예를 들어어떤 직렬화 라이브러리를 사용해야합니까?

:

public Person() 
{ 
    private String name; 
    private int age; 
    private Person parent; 

    void Person(String name, int age) 
    { 
     this.name = name; 
     this.age = age; 

     this.parent = new Person("Mom", 65); 
    } 
} 

나는 "이름"과 사람의 "연령"필드를 저장하고 싶습니다. deserialize 할 때 생성자를 호출하고 부모 객체를 다시 만듭니다.

+0

DateTime 개체로 JSON 문자열 조각을 역 직렬화 할 필요가 fromJson()를 호출하여 어떤 형태의 인터페이스 에게 java.io.Externalizable의 그러나 그것을 사용 기본 생성자를 사용하여 직렬화 해제 할 때 객체를 만들 것이므로 특정 생성자를 사용하도록 지시 할 방법이 없다고 생각합니다. 직접 할 수있는 유일한 방법은 독자적으로 직렬화를 수행하는 것입니다. –

답변

0

당신이 Serializable 다음 당신은 단순히 자바 직렬화 기능을 사용할 수 있습니다 구현되도록 클래스 Person를 변경하는 경우. 그리고 deserialization 프로세스는 모든 객체 계층 구조를 다시 만듭니다.

작업이 단순히 해당 클래스를 직렬화하고 저장하는 경우 다른 라이브러리는 필요하지 않습니다.

여기에 Java 직렬화에 대한 간단한 article이 있습니다.

0

Gson을 사용하면 JSON 표현에서 객체를 직렬화 및 비 직렬화 할 수 있습니다. Gson은 일반 객체를 처리 할 수있는 직렬 및 디시리얼라이저를 내장했지만 특별한 것이 필요하면 직접 구현할 수 있습니다. 이 질문에서 언급 한 예제에서, 클래스가 인수없는 생성자를 가지고 있다면 generic serializer와 deserializers가 작동 할 것입니다.

public class Person { 
    private String name; 
    private int age; 
    private Person parent = null; 

    public Person() { 
    // Required no-args constructor for Gson. 
    } 

    public Person(String name, int age) { 
    this.name = name; 
    this.age = age; 
    } 
} 

직렬화 즉 무한 재귀의 원인이되므로 당신은 순환 참조와 객체를 직렬화 할 수

Person joe = new Person("Joe", 20); 
Gson gson = new Gson(); 
String json = gson.toJson(joe); 
==> json is {"name":"Joe","age":"20"} 

참고 :

간단한 방법은 다음과 같이이 무엇을해야합니다 . 또한 부모가 무기한으로 인스턴스화되기 때문에 질문에 제공된 예제는 불가능합니다.

역 직렬화

Person joe = gson.fromJson(json, Person.class); 

이 이상의 어떤 정의가 필요한 경우, 당신은 사용자 정의 직렬화 및 역 직렬화를 사용할 수 있습니다. user guide에서 :

사용자 정의 직렬화 및 역 직렬화

때로는 기본 표현은 당신이 원하는 없습니다. 라이브러리 클래스 (DateTime 등)를 처리 할 때는 대개 입니다. Gson 을 사용하면 사용자 지정 serializer 및 deserializers를 등록 할 수 있습니다. Json Serialiers : 객체에 대한 사용자 정의 직렬화 사용자 정의 직렬화 : 유형에 대한 사용자 정의 직렬화 정의 인스턴스 작성자 : 필요 없음 인수 없음 생성자를 사용할 수 있거나 직 병렬 변환기가있는 경우 등록

GsonBuilder gson = new GsonBuilder(); 
gson.registerTypeAdapter(MyType2.class, new MyTypeAdapter()); 
gson.registerTypeAdapter(MyType.class, new MySerializer()); 
gson.registerTypeAdapter(MyType.class, new MyDeserializer()); 
gson.registerTypeAdapter(MyType.class, new MyInstanceCreator()); 

registerTypeAdapter 호출 체크 형 어댑터가 이러한 인터페이스 하나 이상을 구현하고 이들 모두를 등록하는 경우. 시리얼 라이저 여기

작성

는 JodaTime 날짜 시간 클래스에 대한 사용자 지정 serializer를 작성하는 방법의 예입니다.

private class DateTimeSerializer implements JsonSerializer<DateTime> { 
    public JsonElement serialize(DateTime src, Type typeOfSrc, 
     JsonSerializationContext context) { 
    return new JsonPrimitive(src.toString()); 
    } 
} 

GSON이 toJson()를 호출은 직렬화시에 DateTime 개체로 실행할 때. 디시리얼라이저

작성

여기 JodaTime 날짜 시간 클래스에 대한 사용자 정의 디시리얼라이저를 작성하는 방법의 예입니다.

private class DateTimeDeserializer implements 
    JsonDeserializer<DateTime> { 
    public DateTime deserialize(JsonElement 
     json, Type typeOfT, JsonDeserializationContext context) 
     throws JsonParseException { 
    return new DateTime(json.getAsJsonPrimitive().getAsString()); 
    } 
} 

GSON은 당신이 직렬화 도착을 제어 할 수 있습니다

관련 문제