'Trying to serialize/deserialize polymorphic objects
I am trying to serialize/deserialize polymorphic objects using gson library. I have tried like this:
A.java
package testing;
public abstract class A {
private final String id;
private final String name;
protected A(String id, String name) {
this.id = id;
this.name = name;
}
}
B.java
package testing;
public class B extends A {
public B(String id, String name) {
super(id, name);
}
}
C.java
package testing;
public class C extends A {
private String c;
public C(String id, String name, String cname) {
super(id, name);
c = cname;
}
public String getC() {
return c;
}
public void setC(String c) {
this.c = c;
}
}
Container.java
package testing;
import java.util.ArrayList;
import java.util.List;
public class Container {
private List<A> list;
public List<A> getList() {
return list;
}
public Container() {
list = new ArrayList<>();
list.add(new B("b_id1", "b_name1"));
list.add(new C("c_id1", "c_name1", "c_name2"));
}
}
AListContainer.java
package testing;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonArray;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
public class AListAdapter implements JsonSerializer<List<A>>, JsonDeserializer<List<A>>
{
private static final String CLASS_NAME = "CLASSNAME";
private static final String INSTANCE = "INSTANCE";
private Gson gson = new GsonBuilder()
.registerTypeAdapter(B.class, new BAdapter())
.registerTypeAdapter(C.class, new CAdapter())
.create();
@Override
public JsonElement serialize(List<A> listA, Type typeOfSrc,
JsonSerializationContext context) {
JsonArray array = new JsonArray();
for (A a : listA) {
JsonObject obj = new JsonObject();
String className = a.getClass().getCanonicalName();
obj.add(CLASS_NAME, context.serialize(className));
JsonElement elem = gson.toJsonTree(a);
obj.add(INSTANCE, elem);
array.add(obj);
}
return array;
}
@Override
public List<A> deserialize(JsonElement json,
Type typeOfT,
JsonDeserializationContext context) throws JsonParseException {
List<A> retVal = new ArrayList();
JsonArray elems = json.getAsJsonArray();
for (int i = 0; i < elems.size(); i++) {
JsonElement oneElem = elems.get(i);
JsonObject oneObj = oneElem.getAsJsonObject();
JsonElement elem = oneObj.get(CLASS_NAME);
String className = elem.getAsString();
JsonElement metricViolation = oneObj.get(INSTANCE);
try {
Class t = Class.forName(className);
A violation = (A) gson.fromJson(metricViolation, t);
retVal.add(violation);
} catch (ClassNotFoundException ex) {
throw new JsonParseException(ex);
}
}
return retVal;
}
}
Main.java
package testing;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;
import java.util.List;
public class Main {
public static void main(String [] args) {
Container d = new Container();
List<A> listA = d.getList();
Gson gson =
new GsonBuilder()
.registerTypeAdapter((new TypeToken<List<A>>() {}).getType(), new AListAdapter())
.serializeSpecialFloatingPointValues()
.create();
String json = gson.toJson(listA);
List<A> resultA = gson.fromJson(json, List.class);
System.out.println(resultA);
}
}
gson is 2.8.5 version:
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.5</version>
</dependency>
It seems that testing.AListAdapter#serialize and testing.AListAdapter#deserialize are not called. Can you help to understand why?
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|
