Rumah >Java >javaTutorial >Bagaimana untuk Mensiri Senarai Objek Polimorfik dengan Gson Menggunakan RuntimeTypeAdapterFactory?

Bagaimana untuk Mensiri Senarai Objek Polimorfik dengan Gson Menggunakan RuntimeTypeAdapterFactory?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-10-31 05:05:02341semak imbas

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

Cara Mensiri Senarai Objek Polimorfik dengan Gson

Apabila berurusan dengan objek polimorfik semasa bersiri, pewarisan dan hierarki kelas boleh menimbulkan cabaran. Satu kaedah untuk menangani perkara ini secara elegan ialah melalui RuntimeTypeAdapterFactory Gson.

Mari kita pertimbangkan contoh di mana kita mempunyai kelas asas, ObixBaseObj dan kelas kanak-kanak, ObixOp. Matlamat kami adalah untuk menyirikan tika ObixBaseObj yang mengandungi koleksi kanak-kanak, termasuk ObixOp.

Dalam coretan kod pertama, kami menghadapi isu di mana ahli yang diwarisi (khususnya, rentetan masuk dan keluar) tiada semasa penyirian . Penyelesaiannya terletak pada penggunaan 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>

Contoh Kerja

Untuk senario di mana berbilang subkelas mewarisi daripada ObixBaseObj, kami boleh melaksanakan mekanisme pendaftaran tersuai dalam ObixBase dan menggunakan kelas utiliti, 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>

Dalam 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>

Pendekatan ini memudahkan penyirian objek polimorfik dengan mendaftarkan subkelas secara automatik dan memastikan ahli yang diwarisi dimasukkan dalam output bersiri.

Atas ialah kandungan terperinci Bagaimana untuk Mensiri Senarai Objek Polimorfik dengan Gson Menggunakan RuntimeTypeAdapterFactory?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn