Menyerikan Objek Polimorfik dengan Gson
Gson ialah perpustakaan Java yang popular untuk menukar objek Java kepada dan dari JSON. Satu cabaran dalam mensiri objek dengan Gson ialah mengendalikan polimorfisme, di mana berbilang subkelas mewarisi daripada superclass biasa.
Masalah
Pertimbangkan senario di mana anda mempunyai hierarki kelas dengan kelas asas ObixBaseObj dan berbilang kelas yang diwarisi seperti ObixOp. Matlamatnya adalah untuk mensirikan objek kelas ini kepada JSON menggunakan Gson sambil mengekalkan ahli yang diwarisi (cth., masuk dan keluar untuk ObixOp).
Contoh 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>
Keputusan
<code class="json">{"obix":"obj","is":"obix:Lobby","children":[{"obix":"op","name":"batch"}]}</code>
Perhatikan bahawa JSON bersiri tidak termasuk ahli ObixOp yang diwarisi (dalam dan luar).
RuntimeTypeAdapterFactory Solution
Untuk mengendalikan polimorfisme dengan anggun, Gson menyediakan ciri berkuasa yang dipanggil RuntimeTypeAdapterFactory. Kelas ini secara automatik mendaftarkan subkelas kepada superclass sepadan mereka untuk bersiri dan penyahserilan.
Pelaksanaan
<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>
Hasil
<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>
Penyelesaian ini mensiri semua ahli dengan betul, termasuk yang diwarisi oleh subkelas.
Mengendalikan Berbilang Subkelas
Dalam kes di mana terdapat berbilang subkelas, RuntimeTypeAdapter Gson menyediakan mekanisme yang mudah untuk mendaftarkannya.
<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">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>
Pendekatan ini memastikan semua subkelas didaftarkan secara automatik dengan GsonBuilder, memudahkan proses bersiri.
Atas ialah kandungan terperinci Bagaimanakah anda menyerikan objek polimorfik dengan Gson dan mengekalkan ahli yang diwarisi dalam output JSON?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!