2011-07-27 2 views
3

gson을 사용하면 특정 필드에서만 사용자 정의 디시리얼라이저/시리얼 라이저를 사용할 수 있습니까? user guide은 특정 필드가 아닌 전체 유형에 대해 어댑터를 등록하는 방법을 보여줍니다. 내가 원하는 이유는 사용자 지정 날짜 형식을 구문 분석하여 long 구성원 필드 (유닉스 타임 스탬프)에 저장하기 때문에 모든 Long 필드에 대한 유형 어댑터를 등록하고 싶지 않기 때문입니다.특정 필드에서만 사용자 정의 디시리얼라이저를 사용합니까?

이 방법이 있습니까?

답변

5

쉽게 개체를 복사 할 수 있도록 내 개체에 날짜 값을 long으로 저장합니다. 또한 개체를 serialize 할 때 날짜 필드 만 재정의하고 프로세스의 모든 필드를 쓸 필요가없는 방법을 원했습니다. 이것이 내가 생각해 낸 해결책이다. 이것을 처리하는 최적의 방법인지는 확실치 않지만 잘 수행하는 것 같습니다.

클래스는 여기 DateString으로 구문 분석하는 데 사용되는 사용자 정의 클래스입니다.

public final class Person { 
    private final String firstName; 
    private final String lastName; 
    private final long birthDate; 

    private Person(String firstName, String lastName, Date birthDate) { 
    this.firstName = firstName; 
    this.lastName = lastName; 
    this.birthDate = birthDate.getTime(); 
    } 

    public static Person getInstance(String firstName, String lastName, Date birthDate) { 
    return new Person(firstName, lastName, birthDate); 
    } 

    public String toJson() { 
    return new GsonBuilder().registerTypeAdapter(Person.class, new PersonSerializer()).create().toJson(this); 
    } 

    public static class PersonSerializer implements JsonSerializer<Person> { 
    @Override 
    public JsonElement serialize(Person person, Type type, JsonSerializationContext context) { 
     JsonElement personJson = new Gson().toJsonTree(person); 
     personJson.getAsJsonObject().add("birthDate", new JsonPrimitive(DateUtil.getFormattedDate(new Date(policy.birthDate), DateFormat.USA_DATE))); 
     return personJson; 
    } 
    } 
} 

클래스가 직렬화

birthDate 필드는 포맷 String 대신 long 값으로 반환됩니다.

+0

위의 문제는 위임을위한'new Gson()'입니다. 기존의 gson (이 유형 어댑터와 별개로 자체 커스터마이징이 가능할 수도 있음)을 사용할 수 있다면 완벽한 솔루션이 될 것입니다. 어떤 아이디어? – Mar0ux

+0

@ Mar0ux, 나는 당신의 요지를 보았습니다. 'Gson' 객체가 클래스의 정적 멤버가 아니라면 어떻게 작동하는지 실제로 알 수 없습니다. 나는 Gson을 더 이상 사용하지 않는다. Spring과의 통합이 잘되어 있기 때문에 Jackson으로 전환했습니다. – Jason

1

long으로 저장하지 마십시오. 적절한 어댑터가있는 사용자 정의 유형을 사용하십시오. 유형 내에서 데이터를 원하는대로 표현하십시오. long, 이유는 무엇입니까?

+0

생각해 보았지만 Long 주위에 래퍼를 작성하는 것이 약간 번거롭다 고 생각합니다. – Felix

+0

래퍼가 아닙니다. 의미 상으로는 실제 객체는 긴 정수가 아닙니다. OOP의 관점에서 볼 때 long을 사용하는 것은 외부 코드와 관련없는 내부 구현 세부 사항이어야합니다. long을 직접 사용하면 * unwrapping *이됩니다. – slezica

+0

내가 저장하는 데이터는 1970 년 1 월 1 일 이후의 밀리 초 수입니다. 그렇습니다. 의미 론적으로 말해서 긴 정수입니다. – Felix

관련 문제