java我的序列化程序相互依赖,如何确保两者都被使用
假设我有两个类,MyClass
和MyOtherClass
。我已经为MyClass
编写了一个序列化程序。没有它,尝试序列化MyOtherClass
将不起作用(因为没有我编写的序列化程序MyClass
就无法序列化)
package com.mycompany.javatest;
import com.google.gson.*;
import java.lang.reflect.*;
public class JavaTest {
static class MyClass {
private int someValue = 123;
}
static class MyOtherClass {
private MyClass mc = new MyClass();
}
static class MyClassSerializer implements JsonSerializer<MyClass> {
@Override
public JsonElement serialize(MyClass t, Type type, JsonSerializationContext jsc) {
JsonObject result = new JsonObject();
// (Doing some magic to serialize the object here...)
result.add("someValue", jsc.serialize(t.someValue));
return result;
}
}
static class MyOtherClassSerializer implements JsonSerializer<MyOtherClass> {
@Override
public JsonElement serialize(MyOtherClass t, Type type, JsonSerializationContext jsc) {
JsonObject result = new JsonObject();
result.add("mc", jsc.serialize(t.mc)); // <--- Will fail if not using the MyClassSerializer
return result;
}
}
public static void main(String[] args) {
GsonBuilder gb = new GsonBuilder();
gb.registerTypeAdapter(MyOtherClassSerializer.class, new MyOtherClassSerializer());
Gson gson = gb.create();
MyOtherClass object = new MyOtherClass();
String json = gson.toJson(object, MyOtherClass.class); // <--- MyClassSerializer.serialize MUST be invoked, or this will fail
}
}
我的问题是,当MyOtherClassSerializer
被注册时,我如何强制MyClassSerializer
被注册?显而易见的答案是只注册两个类型适配器,但我想知道在注册MyOtherClassSerializer
时是否有办法强制注册这两个类型适配器。一个选项是只允许类型适配器通过这样的“register”方法访问,但我不喜欢这种解决方案。我仍然希望MyClassSerializer
可以访问
public void registerMyOtherClassSerializer(GsonBuilder builder) {
builder.registerTypeAdapter(MyClass.class, new MyClassSerializer());
builder.registerTypeAdapter(MyOtherClass.class, new MyOtherClassSerializer());
}
想法
# 1 楼答案
多亏了托马斯·克莱格。这就是我最后做的: