>  기사  >  Java  >  RuntimeTypeAdapterFactory를 사용하여 Gson으로 다형성 개체 목록을 직렬화하는 방법은 무엇입니까?

RuntimeTypeAdapterFactory를 사용하여 Gson으로 다형성 개체 목록을 직렬화하는 방법은 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-10-31 05:05:02271검색

How to Serialize a List of Polymorphic Objects with Gson Using RuntimeTypeAdapterFactory?

Gson을 사용하여 다형성 개체 목록을 직렬화하는 방법

직렬화 중에 다형성 개체를 처리할 때 상속 및 클래스 계층 구조가 문제를 일으킬 수 있습니다. 이 문제를 우아하게 해결하는 한 가지 방법은 Gson의 RuntimeTypeAdapterFactory를 사용하는 것입니다.

기본 클래스인 OlixBaseObj와 하위 클래스인 OlixOp가 있는 예를 고려해 보겠습니다. 우리의 목표는 ObixOp를 포함하여 하위 컬렉션을 포함하는 OlixBaseObj의 인스턴스를 직렬화하는 것입니다.

첫 번째 코드 조각에서는 직렬화 중에 상속된 멤버(구체적으로 in 및 out 문자열)가 누락되는 문제가 발생합니다. . 해결책은 RuntimeTypeAdapterFactory를 사용하는 것입니다.

<code class="java">RuntimeTypeAdapterFactory<ObixBaseObj> adapter = 
        RuntimeTypeAdapterFactory
                .of(ObixBaseObj.class)
                .registerSubtype(ObixBaseObj.class)
                .registerSubtype(ObixOp.class);

Gson gson2=new GsonBuilder().setPrettyPrinting().registerTypeAdapterFactory(adapter).create();
System.out.println(gson2.toJson(lobbyObj));</code>

작업 예제

여러 하위 클래스가 ObixBaseObj에서 상속되는 시나리오의 경우 ObixBaseObj 내에서 사용자 정의 등록 메커니즘을 구현할 수 있으며 유틸리티 클래스 GsonUtils 활용:

<code class="java">public class ObixBaseObj {
    // ...
    private static final RuntimeTypeAdapterFactory<ObixBaseObj> adapter = 
            RuntimeTypeAdapterFactory.of(ObixBaseObj.class);

    public static void registerType(
            RuntimeTypeAdapterFactory<?> adapter) {
        GsonUtils.registerType(adapter);
    }

    // ...
}

public class ObixOp extends ObixBaseObj {
    // ...
    public ObixOp() {
        super();
        obix = "op";
    }

    // ...
}</code>

GsonUtils에서:

<code class="java">public class GsonUtils {
    private static final GsonBuilder gsonBuilder = new GsonBuilder()
            .setPrettyPrinting();

    public static void registerType(
            RuntimeTypeAdapterFactory<?> adapter) {
        gsonBuilder.registerTypeAdapterFactory(adapter);
    }

    public static Gson getGson() {
        return gsonBuilder.create();
    }
}</code>
<code class="java">ObixBaseObj lobbyObj = new ObixBaseObj();
lobbyObj.setIs("obix:Lobby");

ObixOp batchOp = new ObixOp();
batchOp.setName("batch");
batchOp.setIn("obix:BatchIn");
batchOp.setOut("obix:BatchOut");

lobbyObj.addChild(batchOp);

Gson gson = GsonUtils.getGson();
System.out.println(gson.toJson(lobbyObj));</code>

이 접근 방식은 자동으로 하위 클래스를 등록하고 상속된 멤버가 포함되도록 하여 다형성 객체의 직렬화를 단순화합니다. 직렬화된 출력에서.

위 내용은 RuntimeTypeAdapterFactory를 사용하여 Gson으로 다형성 개체 목록을 직렬화하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.