Java TypeAdapterFactory中的Gson-JsonSerializer或TypeAdapter中的泛型类型
我正在尝试为我正在使用的JavaFX类型(不同的属性和可观察对象)编写一个Java TypeAdapterFactory中的Gson-JsonSerializer或TypeAdapter中的泛型类型,java,javafx,gson,Java,Javafx,Gson,我正在尝试为我正在使用的JavaFX类型(不同的属性和可观察对象)编写一个TypeAdapterFactory。对于ObjectProperty,我可以编写一个JsonSerializer/反序列化器,利用对参数化类型的转换,然后获取实际类型参数 这是我用来实现这一目标的代码: public class ObjectPropertySerializer implements JsonSerializer<ObjectProperty>, JsonDeserializer<Obj
TypeAdapterFactory
。对于ObjectProperty
,我可以编写一个JsonSerializer/反序列化器
,利用对参数化类型的转换,然后获取实际类型参数
这是我用来实现这一目标的代码:
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);
}
}
我不能在这里返回序列化器/反序列化器接口的实现,但需要使用扩展TypeAdapter
的适配器类
这是我的TypeAdapter
的ObjectProperty
实现:
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
}
}
}
公共类ObjectPropertyAdapter扩展了TypeAdapter{
私人Gson;
类型适配器元素适配器;
公共对象属性适配器(Gson Gson){
this.gson=gson;
elementAdapter=gson.getAdapter(jsoneElement.class);
}
@凌驾
public void write(JsonWriter out,ObjectProperty值)抛出IOException{
如果(值==null){
out.nullValue();
}否则{
JsonElement=gson.toJsonTree(value.get());
elementAdapter.write(out,jsonElement);
}
}
@凌驾
公共对象属性读取(JsonReader in)引发IOException{
if(in.peek()==JsonToken.NULL){
in.nextNull();
返回null;
}否则{
//阅读
返回null;//tmp
}
}
}
但是,我不知道如何在TypeAdapter中获取generic for ObjectProperty的类型,也不知道如何从TypeToken获取它(因为我可以从工厂将它传递给适配器)
问题摘要:
1) 如何将JsonSerializer/Deserializer
的实现强制转换为TypeAdapter
或
2) 如何从TypeToken获取对象属性等的泛型类型
或
3) 我需要做一些完全不同的事情来实现这一点吗?1)你不能JsonSerializer
和JsonSerializer
是旧的转换器方式。新的应用程序应该使用TypeAdapter
,它有一个功能性超集
2) 假设您是指JavaFX,并且您想要提取T的类
您可以使用TypeToken\getType()
轻松访问TypeToken
内部的Type
我将用List
给出一个示例,这个示例的思想相同,但易于测试
TypeToken<List<String>> typeToken = new TypeToken<List<String>>(){};
System.out.println("typeToken.getRawType() = " + typeToken.getRawType());
Type type = typeToken.getType();
System.out.println("typeToken.getType() = " + type);
if (type instanceof ParameterizedType) {
Type[] typeArguments = ((ParameterizedType) type).getActualTypeArguments();
System.out.println("typeArguments = " + Arrays.toString(typeArguments));
}
TypeToken-TypeToken=new-TypeToken(){};
System.out.println(“typeToken.getRawType()=”+typeToken.getRawType());
Type Type=typeToken.getType();
System.out.println(“typeToken.getType()=”+type);
if(类型instanceof ParameterizedType){
类型[]类型参数=((ParameteredType)类型)。getActualTypeArguments();
System.out.println(“typeArguments=“+Arrays.toString(typeArguments));
}
输出结果:
typeToken.getRawType() = interface java.util.List
typeToken.getType() = java.util.List<java.lang.String>
typeArguments = [class java.lang.String]
typeToken.getRawType()=接口java.util.List
typeToken.getType()=java.util.List
typeArguments=[类java.lang.String]
3) 我想你就快到了啊,使用TypeAdapter
时,您不会考虑JsonObject
或JsonElement
(DOM样式),而是动态构建对象或JSON表示(流样式)
还有,在你的问题中你说
但是,我还需要使用TypeAdapterFactory,因为嵌套
类/对象和直接序列化,当
使用将序列化程序直接注册到GsonBuilder
.registerTypeAdapter()
也许您需要使用GsonBuilder#registerTypeHierarchyAdapter()
并查找那些嵌套类。这将取决于您的问题详细信息。不幸的是,typeToken.getType似乎不是ParameterizedType的实例:/What type It is is is is?你能调试它吗?您可以从TypeToken中获得哪些信息?我还添加了关于GsonBuilder#registerTypeHierarchyAdapter()
java.lang.ClassCastException:java.lang.Class不能强制转换为java.lang.reflect.ParameterizedType
我需要使用的确定:TypeToken TypeToken=new TypeToken(){}代码>而不仅仅是ObjectProperty,因为它只是一个抽象类。
typeToken.getRawType() = interface java.util.List
typeToken.getType() = java.util.List<java.lang.String>
typeArguments = [class java.lang.String]