2013-09-05 2 views
43

Gson user guide은 모든 클래스가 Gson과 제대로 작동하도록 기본 no-args 생성자를 정의해야한다고 말합니다. 심지어 Gson의 InstanceCreator 클래스에있는 javadoc 클래스에서 기본 누락 된 클래스 생성자가없는 인스턴스를 deserialize하려고하면 예외가 발생하고 이어야합니다. InstanceCreator을 사용해야합니다. 그러나, 나는 기본 생성자가없는 클래스와 함께 Gson을 사용하여 테스트 해 보았고, 직렬화와 비 직렬화 작업은 문제없이 수행되었다.Gson에게는 기본 no-args 생성자가 필수입니까?

다음은 deserializaiton 코드입니다. 비 인수 생성자가없는 클래스 :

public class Mushroom { 
    private String name; 
    private double diameter; 

    public Mushroom(String name, double diameter) { 
     this.name = name; 
     this.diameter = diameter; 
    } 

    //equals(), hashCode(), etc. 
} 

및 테스트 : 잘 작동

@Test 
public void deserializeMushroom() { 
    assertEquals(
      new Mushroom("Fly agaric", 4.0), 
      new Gson().fromJson(
        "{name:\"Fly agaric\", diameter:4.0}", Mushroom.class)); 
} 

.

제 질문은 : 기본 생성자가 없어도 Gson을 실제로 사용할 수 있습니까? 아니면 작동하지 않을 상황이 있습니까?

답변

70

Gson 2.3.1부터. 클래스는 인자없는 생성자를 가지고 있지 않으며 어떤 InstanceCreater 객체를 등록하지 않은 경우에 관계없이 GSON 문서의 말씀의

, 그것은 생성합니다 사용하는 UnsafeAllocator와 (당신의 오브젝트를 구축)을 ObjectConstructor 반향을 통해 allocateInstance 클래스 sun.misc.Unsafe 메서드를 사용하여 클래스 인스턴스를 만듭니다.

Unsafe class은 no-args 생성자가 부족하고 many other dangerous uses입니다. allocateInstance 상태

인스턴스를 할당하지만 생성자는 실행하지 마십시오. 클래스를 아직 초기화하지 않은 경우 초기화합니다.

그래서 실제로 생성자가 필요하지 않고 두 개의 인수 생성자를 둘러 볼 것입니다. 몇 가지 예 (here)를 참조하십시오.

당신이 인자없는 생성자이있는 경우, GSON 기본적 Constructor

yourClassType.getDeclaredConstructor(); // ie. empty, no-args 

내 2 센트를 호출하여 사용하는 ObjectConstructor를 사용합니다 : 노으로 클래스를 GSON의 말씀에 따라 작성 -arg 생성자 또는 InstanceCreator을 등록하십시오. Unsafe을 사용하면 몸 상태가 좋지 않을 수도 있습니다. 여기에 설명 된대로

+0

최종 구성원을 null로 설정하는 기본 생성자가 있지만이 구성원에 대한 설정자가없는 경우 어떻게됩니까? 그게 합리적인 해결책입니까? –

+1

@ thomas.mc.work Gson은 리플렉션 (그리고 잠재적으로 안전하지 않은 작업)을 통해 필드를 직접 설정할 수 있으며 getter (또는 직접 필드를 통해 검색 할 수 있습니다.이 디자인은 권장하지 않습니다.) –

+0

I '여기에 설명되어있는 라이브러리 잭슨의'최종 '문제에 대한 좋은 해결책을 찾았습니다. http://stackoverflow.com/a/11838468/2854723 –

관련 문제