Pensirian Objek Polimorfik dengan Gson
Perwakilan objek bersiri selalunya termasuk data daripada kelas yang diwarisi, yang boleh mencabar apabila berurusan dengan objek polimorfik. Menggunakan Gson untuk siri JSON, berikut ialah penyelesaian untuk mengendalikan warisan polimorfik dengan elegan.
Masalah
Apabila menukar objek dengan warisan polimorfik kepada JSON menggunakan Gson, nilai ahli diwarisi sering diabaikan daripada perwakilan JSON yang terhasil.
Penyelesaian: RuntimeTypeAdapterFactory
Penyelesaian melibatkan penggunaan RuntimeTypeAdapterFactory Gson. Utiliti ini secara automatik mengenal pasti dan menyerikan ahli kelas yang diwarisi tanpa memerlukan penyesuai siri tersuai.
<code class="java">// Register complex class types in the adapter RuntimeTypeAdapterFactory<ObixBaseObj> adapter = RuntimeTypeAdapterFactory .of(ObixBaseObj.class) .registerSubtype(ObixBaseObj.class) .registerSubtype(ObixOp.class); // Use registered adapter in GsonBuilder Gson gson2 = new GsonBuilder().registerTypeAdapterFactory(adapter).create();</code>
Dengan mendaftarkan jenis dengan penyesuai, Gson boleh mengecam jenis kelas yang diwarisi semasa penyirian, termasuk nilai ahli khusus mereka dalam JSON perwakilan.
Contoh: Pendaftaran Kelas dengan Kaedah Pembantu
Untuk mempertingkatkan penyelesaian, pertimbangkan untuk menggunakan kelas pembantu, seperti GsonUtils, untuk mengurus pendaftaran jenis. Pendekatan ini memusatkan pendaftaran dan menghapuskan keperluan untuk langkah manual dalam pembina kelas individu.
<code class="java">public class GsonUtils { // Store registered types private static final HashSet<Class<?>> registeredClasses = new HashSet<>(); // Register a type using RuntimeTypeAdapterFactory public static void registerType(RuntimeTypeAdapterFactory<?> adapter) { GsonBuilder.registerTypeAdapterFactory(adapter); } // Get a fully configured Gson instance public static Gson getGson() { return new GsonBuilder().registerTypeAdapterFactory(adapter).create(); } } // In base class, automatically register inherited classes public class ObixBaseObj { static { GsonUtils.registerType(adapter); } }</code>
Contoh Dipertingkat: Pendaftaran Jenis Dinamik
Pendekatan ini juga membenarkan jenis dinamik pendaftaran semasa instantiasi objek. Setiap kali kelas yang diwarisi dibuat seketika, kelas itu didaftarkan secara automatik dengan RuntimeTypeAdapterFactory untuk penyirian yang betul.
<code class="java">// Dynamic class registration in inherited class public class ObixOp extends ObixBaseObj { public ObixOp() { super(); registerClass(); obix = "op"; } }</code>
Atas ialah kandungan terperinci Bagaimana untuk Mensiri Objek Polimorfik dengan Berkesan dengan Gson?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!