programing

Gson에서는 기본 no-args 컨스트럭터가 필수입니까?

newsource 2023. 3. 6. 21:10

Gson에서는 기본 no-args 컨스트럭터가 필수입니까?

Gson 사용자 가이드에 따르면 Gson과 올바르게 동작하려면 모든 클래스에 대해 기본 no-args 컨스트럭터를 정의해야 합니다.게다가 Gson's의 자바독에서는InstanceCreator클래스에서는 클래스 누락 기본 생성자의 인스턴스를 역직렬화하려고 하면 예외가 발생한다고 합니다.InstanceCreator그런 경우에는.단, 디폴트 컨스트럭터가 없는 클래스로 Gson을 테스트해 보고 serialization과 deserialization 모두 문제없이 동작하고 있습니다.

여기 탈세리얼라이즌의 코드 조각이 있습니다.비args 생성자가 없는 클래스:

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을 디폴트 컨스트럭터를 사용하지 않아도 사용할 수 있는지, 아니면 작동하지 않는 상황이 있는지 여부입니다.

Gson 2.3.1 현재.

Gson 매뉴얼에 기재되어 있는 내용에 관계없이 클래스에 no-args 컨스트럭터가 없고 등록되지 않은 경우InstanceCreater오브젝트를 작성하면,ObjectConstructor(오브젝트를 구축합니다).UnsafeAllocatorReflection을 사용하여 Relection을 사용하여allocateInstance수업 방법sun.misc.Unsafe클래스 인스턴스를 만듭니다.

클래스는 no-args 컨스트럭터의 결여를 우회하여 다른 위험한 용도를 많이 가지고 있습니다. allocateInstance미국.

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

따라서 실제로는 생성자가 필요하지 않고 두 개의 인수 생성자를 순환합니다.몇 가지 예를 참조하십시오.

no-args 컨스트럭터가 있는 경우 Gson은 no-args 컨스트럭터를 사용합니다.ObjectConstructor디폴트를 사용합니다.Constructor부름으로써

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

나의 2센트:Gson의 말에 따라 no-arg 컨스트럭터로 클래스를 만들거나 등록합니다.InstanceCreator. 를 사용하여 자신의 처지가 좋지 않을 수 있습니다.Unsafe.

잭슨 라이브러리에는 다음과 같은 좋은 솔루션이 있습니다.

https://stackoverflow.com/a/11838468/2854723

여기서 중요한 것은 인수와 함께 컨스트럭터를 사용할 때 사용할 JSON 필드를 믹스인 기능을 통해 시리얼라이저에 지시하는 것입니다.

해당 엔티티가 외부 라이브러리의 일부인 경우 Creator 기능을 사용하여 "원격 주석"을 추가할 수 있습니다.

raindev의 예에서는 JSON에 모든 값이 있기 때문에 정상입니다.따라서 초기화하지 않은 변수도 모두 덮어씁니다.그러나 대부분의 경우 JSON에 값이 없는 Transient 필드 또는 옵션 필드가 있을 수 있습니다.no-args 컨스트럭터가 없는 경우 필드는 null로 유지되며 다른 사용자가 읽으려고 하면 NPE가 됩니다.

언급URL : https://stackoverflow.com/questions/18645050/is-default-no-args-constructor-mandatory-for-gson