我有一个抽象类和一组具体类。
class AbstractClass {
..
}
class ConcreteClass extends AbstractClass {
..
}
我有一个实现了 JsonSerializer 和 JsonDeserializer 的自定义适配器
public class AbstractClassAdaptor implements JsonSerializer<AbstractClass>, JsonDeserializer<AbstractClass> {
@Override
public JsonElement serialize(AbstractClass src, Type typeOfSrc, JsonSerializationContext context) {
JsonObject result = new JsonObject();
result.add("type", new JsonPrimitive(src.getClass().getSimpleName()));
result.add("properties", context.serialize(src, src.getClass()));
return result;
}
@Override
public AbstractClass deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
JsonObject jsonObject = json.getAsJsonObject();
String type = jsonObject.get("type").getAsString();
JsonElement element = jsonObject.get("properties");
try {
return context.deserialize(element, Class.forName("com.myjson." + type));
} catch (ClassNotFoundException cnfe) {
throw new JsonParseException("Unknown element type: " + type, cnfe);
}
}
//测试 block
Gson gson = new GsonBuilder().registerTypeAdapter(AbstractClass.class, new AbstractClassAdaptor()).create();
AbstractClass obj = new ConcreteClass();
String jsonString = gson.toJson(obj);
未调用 AbstractClassAdaptor 中的 Serialize 方法。这从 json 输出中可以明显看出,它在序列化后不包含任何类型和属性的痕迹。
最佳答案
实现此功能的一种方法(也是迄今为止我使用的唯一一种方法)是将所需类型传递给 toJson
方法。所以
String jsonString = gson.toJson(obj, AbstractClass.class);
将在 AbstractClassAdaptor
中调用您自定义的序列化程序。同样,您需要在反序列化时这样做。
关于java - gson.toGson() 不调用自定义序列化方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28123337/