>  기사  >  Java  >  RuntimeTypeAdapterFactory를 사용하여 Gson으로 다형성 객체 목록을 어떻게 직렬화합니까?

RuntimeTypeAdapterFactory를 사용하여 Gson으로 다형성 객체 목록을 어떻게 직렬화합니까?

Barbara Streisand
Barbara Streisand원래의
2024-10-30 15:13:02310검색

How do you serialize polymorphic object lists with Gson using RuntimeTypeAdapterFactory?

다형성 개체 목록의 Gson 직렬화

Gson은 RuntimeTypeAdapterFactory를 사용하여 다형성 개체를 직렬화하는 솔루션을 제공합니다. 이 클래스는 상속된 멤버의 직렬화를 자동으로 처리하므로 사용자 지정 직렬 변환기를 작성할 필요가 없습니다.

구현

RuntimeTypeAdapterFactory를 사용하려면 다음 단계를 따르세요.

  1. 기본 클래스 ObixBaseObj에 대한 RuntimeTypeAdapterFactory의 인스턴스를 생성합니다.
  2. registerSubtype()을 사용하여 ObixBaseObj의 모든 하위 클래스를 등록합니다.
  3. registerTypeAdapterFactory()를 사용하여 RuntimeTypeAdapterFactory를 GsonBuilder에 제공합니다.

<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);

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>

출력

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

고급 사용 사례

많은 수의 하위 클래스를 처리하려면 GsonUtils와 같은 유틸리티 클래스를 생성하여 등록을 관리하고 중앙 집중식 Gson 인스턴스를 제공하세요.

<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();
    }
}

public class ObixBaseObj {

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

    private static final HashSet<Class<?>> registeredClasses= new HashSet<>();

    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";
    }
}

public class ObixOp extends ObixBaseObj {

    private String in;
    private String out;

    public ObixOp() {
        super();
        obix = "op";
    }

    public ObixOp(String in, String out) {
        super();
        obix = "op";
        this.in = in;
        this.out = out;
    }
}</code>

이 접근 방식을 사용하면 다형성 객체의 상속된 모든 멤버가 자동으로 직렬화 및 역직렬화되어 복잡한 상속 계층을 처리하기 위한 편리한 솔루션을 제공합니다.

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

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