Gson을 사용하여 다형성 객체 직렬화
Gson은 Java 객체를 JSON으로 변환하는 데 널리 사용되는 Java 라이브러리입니다. Gson을 사용하여 객체를 직렬화하는 데 있어 한 가지 과제는 여러 하위 클래스가 공통 슈퍼클래스에서 상속되는 다형성을 처리하는 것입니다.
문제
기본 클래스 OlixBaseObj 및 OlixOp와 같은 여러 상속 클래스. 목표는 상속된 멤버(예: OlixOp의 in 및 out)를 유지하면서 Gson을 사용하여 이러한 클래스의 객체를 JSON으로 직렬화하는 것입니다.
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>
결과
<code class="json">{"obix":"obj","is":"obix:Lobby","children":[{"obix":"op","name":"batch"}]}</code>
직렬화된 JSON에는 ObixOp(in 및 out)의 상속된 멤버가 포함되지 않습니다.
RuntimeTypeAdapterFactory 솔루션
다형성을 적절하게 처리하기 위해 Gson은 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(); Gson gson = new Gson(); System.out.println(gson.toJson(lobbyObj)); System.out.println("---------------------"); System.out.println(gson2.toJson(lobbyObj));</code>
결과
<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>
이 솔루션은 하위 클래스에서 상속된 구성원을 포함하여 모든 구성원을 올바르게 직렬화합니다.
여러 하위 클래스 처리
하위 클래스가 여러 개인 경우 Gson의 RuntimeTypeAdapter는 편리한 메커니즘을 제공합니다.
<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>
이 접근 방식을 사용하면 모든 하위 클래스가 GsonBuilder에 자동으로 등록되어 직렬화 프로세스가 단순화됩니다.
위 내용은 Gson을 사용하여 다형성 개체를 어떻게 직렬화하고 JSON 출력에서 상속된 멤버를 보존합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!