2012-12-05 2 views
3

나는 Gson 사용자 안내서의 Versioning Support section을보고 있습니다.Gson - 버전 관리에 대한 질문

질문 1 : Class, Fields 및 (향후 릴리스에서) 메소드에 @Since 주석을 사용할 수 있다고 말합니다. 객체 필드의 직렬화를 이해하지만 클래스메서드을 직렬화한다는 것은 무엇을 의미합니까?

질문 2 : Gson 개체를 만들 때 버전을 지정할 수 있다고 가정하면 @Since로 주석 된 필드와 그보다 큰 버전 번호는 무시됩니다. 이 점은 정확히 무엇입니까? Json이 역 직렬화 될 Java 클래스에 존재하지 않는 추가 필드를 포함하면 해당 필드가 무시된다는 것을 알고 있습니다. 그렇다면 왜 @Since 주석을 사용해야합니까?

+0

Que 2의 경우. 값 데이터 유형이 변경되면 json 구문 분석과 다른 이유는 무엇입니까? 이에 대한 예가 여기에 나와 있습니다. http://bethecoder.com/applications/tutorials/json/google-gson/versioning.html – Sankalp

답변

0

질문 2의 경우 : @Since는 주로 직렬화에 도움이됩니다. 버전 번호가 더 큰 필드는 무시되므로 최신 버전의 클래스에서 JSON을 작성합니다.

@Since는 탈 섬화에도 영향을 미치므로 내 의견에는 유용하지 않습니다. deserealization을 위해 @Since를 사용하면 JSON에있는 일부 필드가 무시되고 사용되는 버전 번호가 일부 필드보다 작 으면 클래스에도 표시됩니다. JSON을 새 클래스에서 읽는 것과 같은 새로운 클래스에서 JSON을 읽으므로 내 의견에는 유용하지 않습니다.

JSON 예 :

{ 
    oldField: "value1", 
    newField: "value2" 
} 

자바 클래스 :

class MyClass { 
    @Since(0.0) 
    public String oldField; 
    @Since(1.0) 
    public String newField; 
} 

자바 테스트 : @since 경우 newField가 무시되었습니다 방법을 보여주는

public static void main(String[] args) { 
    Gson gson = new GsonBuilder().setVersion(0.0).create(); 
    MyClass myClass = gson.fromJson("{oldField: \"value1\", newerField: \"value2\"}", MyClass.class); 

    System.out.println("read as version 0.0:"); 
    System.out.println(myClass.oldField); 
    System.out.println(myClass.newField); 


    Gson gson2 = new GsonBuilder().create(); 
    MyClass myClass2 = gson2.fromJson("{oldField: \"value1\", newField: \"value2\"}", MyClass.class); 

    System.out.println("read without version specified:"); 
    System.out.println(myClass2.oldField); 
    System.out.println(myClass2.newField); 
} 

결과 작은 :

read as version 0.0 
value1 
null 

read without version specified 
value1 
value2 
관련 문제