Gson 為以 JSON 格式序列化多態性物件提供全面支援。當物件具有共享基底類別但不同的實作時,就會出現多態性。為了有效地序列化此類對象,Gson 提供了一個稱為 RuntimeTypeAdapterFactory 的功能。
考慮以下場景:您有一個基類 ObixBaseObj 和多個繼承自它的子類,例如 ObixOp。當序列化包含子物件的 ObixBaseObj 類型的物件時,Gson 的預設行為是僅序列化基底類別中定義的欄位。這可能會導致子類別中省略特定欄位。
要解決此問題,您可以使用 RuntimeTypeAdapterFactory。它使您能夠在單一類型適配器下註冊不同的子類型。透過這樣做,Gson 可以有效地序列化特定於每個子類型的字段,提供多態物件的完整表示。
<code class="java">RuntimeTypeAdapterFactory<ObixBaseObj> adapter = RuntimeTypeAdapterFactory .of(ObixBaseObj.class) .registerSubtype(ObixBaseObj.class) .registerSubtype(ObixOp.class);</code>
上面的程式碼向適配器註冊了 ObixBaseObj 和 ObixOp 子類型。然後可以將其整合到Gson 的配置中以啟用多態性序列化:
<code class="java">Gson gson2=new GsonBuilder().setPrettyPrinting().registerTypeAdapterFactory(adapter).create();</code>
透過使用這個修改後的Gson 實例,可以有效地序列化和反序列化多態性對象,準確保留從基底類別繼承的欄位和特定的欄位。
或者,您可以透過利用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>
在ObixBaseObj 及其子類別中,您可以利用GsonUtils 來確保子類型註冊是自動執行的:
<code class="java">public class ObixBaseObj { private static final RuntimeTypeAdapterFactory<ObixBaseObj> adapter = RuntimeTypeAdapterFactory.of(ObixBaseObj.class); private static final HashSet<Class<?>> registeredClasses= new HashSet<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>
透過這種方法,每當建立基底類別或子類別的實例時,它將自動向RuntimeTypeAdapterFactory 註冊其子類型,確保全面的序列化。
以上是如何使用 Gson 序列化多態物件並確保所有欄位都包含在 JSON 輸出中?的詳細內容。更多資訊請關注PHP中文網其他相關文章!