【发布时间】:2016-04-19 17:51:38
【问题描述】:
我正在尝试为我正在使用的 JavaFX 类型(不同的属性和可观察对象)编写 TypeAdapterFactory。对于ObjectProperty,我可以编写一个JsonSerializer/Deserializer,利用ParamterizedType 的转换,然后得到ActualTypeArguments。
这是我用来实现此目的的代码:
public class ObjectPropertySerializer implements JsonSerializer<ObjectProperty>, JsonDeserializer<ObjectProperty> {
@Override
public ObjectProperty deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
Type objectType = ((ParameterizedType)typeOfT).getActualTypeArguments()[0];
return new SimpleObjectProperty(new GsonBuilder().create().fromJson(json, objectType));
}
@Override
public JsonElement serialize(ObjectProperty src, Type typeOfSrc, JsonSerializationContext context) {
Type objectType = ((ParameterizedType)typeOfSrc).getActualTypeArguments()[0];
return new GsonBuilder().create().toJsonTree(src.getValue(), objectType);
}
}
但是,由于嵌套类/对象和直接序列化,我还需要使用 TypeAdapterFactory,这在使用 .registerTypeAdapter() 将序列化程序直接注册到 GsonBuilder 时不起作用。
这是到目前为止我工厂的代码(其他属性已经工作):
public class JFXGsonAdapterFactory implements TypeAdapterFactory {
public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
if ( BooleanProperty.class.isAssignableFrom(type.getRawType()) ) {
return (TypeAdapter<T>) new BooleanPropertyAdapter();
}
else if ( DoubleProperty.class.isAssignableFrom(type.getRawType()) ) {
return (TypeAdapter<T>) new DoublePropertyAdapter();
}
else if (IntegerProperty.class.isAssignableFrom(type.getRawType()) ) {
return (TypeAdapter<T>) new IntegerPropertyAdapter();
}
else if (ObjectProperty.class.isAssignableFrom(type.getRawType()) ) {
return (TypeAdapter<T>) new ObjectPropertyAdapter(gson);
}
else if ( StringProperty.class.isAssignableFrom(type.getRawType()) ) {
return (TypeAdapter<T>) new StringPropertyAdapter();
}
else {
return null;
}
}
}
我无法在此处返回序列化器/反序列化器接口的实现,但需要使用扩展 TypeAdapter 的适配器类。
这是我对ObjectProperty 的TypeAdapter 实现:
public class ObjectPropertyAdapter<T> extends TypeAdapter<ObjectProperty> {
private Gson gson;
TypeAdapter<JsonElement> elementAdapter;
public ObjectPropertyAdapter( Gson gson ) {
this.gson = gson;
elementAdapter = gson.getAdapter(JsonElement.class);
}
@Override
public void write(JsonWriter out, ObjectProperty value) throws IOException {
if ( value == null ) {
out.nullValue();
} else {
JsonElement jsonElement = gson.toJsonTree(value.get());
elementAdapter.write(out, jsonElement);
}
}
@Override
public ObjectProperty read(JsonReader in) throws IOException {
if (in.peek() == JsonToken.NULL) {
in.nextNull();
return null;
} else {
// Read
return null; // tmp
}
}
}
但是我不确定如何在 TypeAdapter 中获取 ObjectProperty 的泛型类型,我也不知道如何从 TypeToken 中获取它(因为我可以将它从工厂传递给适配器)。
问题总结:
1) 如何将 JsonSerializer/Deserializer 的实现转换为 TypeAdapter
或
2) 我怎样才能获得通用类型,例如来自 TypeToken 的 ObjectProperty?
或
3) 我需要做一些完全不同的事情来实现这一目标吗?
【问题讨论】: