>  기사  >  Java  >  Gson을 사용하여 다형성 개체를 어떻게 직렬화하고 JSON 출력에서 ​​상속된 멤버를 보존합니까?

Gson을 사용하여 다형성 개체를 어떻게 직렬화하고 JSON 출력에서 ​​상속된 멤버를 보존합니까?

Linda Hamilton
Linda Hamilton원래의
2024-10-31 21:09:02477검색

How do you serialize polymorphic objects with Gson and preserve inherited members in the JSON output?

Gson을 사용하여 다형성 객체 직렬화

Gson은 Java 객체를 JSON으로 변환하는 데 널리 사용되는 Java 라이브러리입니다. Gson을 사용하여 객체를 직렬화하는 데 있어 한 가지 과제는 여러 하위 클래스가 공통 슈퍼클래스에서 상속되는 다형성을 처리하는 것입니다.

문제

기본 클래스 OlixBaseObj 및 OlixOp와 같은 여러 상속 클래스. 목표는 상속된 멤버(예: OlixOp의 in 및 out)를 유지하면서 Gson을 사용하여 이러한 클래스의 객체를 JSON으로 직렬화하는 것입니다.

GsonSerialization 예

<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 = new Gson();
System.out.println(gson.toJson(lobbyObj));</code>

결과

<code class="json">{"obix":"obj","is":"obix:Lobby","children":[{"obix":"op","name":"batch"}]}</code>

직렬화된 JSON에는 ObixOp(in 및 out)의 상속된 멤버가 포함되지 않습니다.

RuntimeTypeAdapterFactory 솔루션

다형성을 적절하게 처리하기 위해 Gson은 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();
Gson gson = new Gson();
System.out.println(gson.toJson(lobbyObj));
System.out.println("---------------------");
System.out.println(gson2.toJson(lobbyObj));</code>

결과

<code class="json">{"obix":"obj","is":"obix:Lobby","children":[{"obix":"op","name":"batch","children":[]}]}
---------------------
{
  "type": "ObixBaseObj",
  "obix": "obj",
  "is": "obix:Lobby",
  "children": [
    {
      "type": "ObixOp",
      "in": "obix:BatchIn",
      "out": "obix:BatchOut",
      "obix": "op",
      "name": "batch",
      "children": []
    }
  ]
}</code>

이 솔루션은 하위 클래스에서 상속된 구성원을 포함하여 모든 구성원을 올바르게 직렬화합니다.

여러 하위 클래스 처리

하위 클래스가 여러 개인 경우 Gson의 RuntimeTypeAdapter는 편리한 메커니즘을 제공합니다.

  1. 유형 등록을 위한 중앙 집중식 클래스 만들기(예: 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>
  1. 하위 클래스 내에 어댑터 등록:
<code class="java">public class ObixBaseObj {

    private static final RuntimeTypeAdapterFactory<ObixBaseObj> adapter = 
            RuntimeTypeAdapterFactory.of(ObixBaseObj.class);

    static {
        GsonUtils.registerType(adapter);
    }

    private synchronized void registerClass() {
        if (!registeredClasses.contains(this.getClass())) {
            registeredClasses.add(this.getClass());
            adapter.registerSubtype(this.getClass());
        }
    }

    public ObixBaseObj() {
        registerClass();
        obix = "obj";
    }
}</code>

이 접근 방식을 사용하면 모든 하위 클래스가 GsonBuilder에 자동으로 등록되어 직렬화 프로세스가 단순화됩니다.

위 내용은 Gson을 사용하여 다형성 개체를 어떻게 직렬화하고 JSON 출력에서 ​​상속된 멤버를 보존합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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