Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java TypeAdapterFactory中的Gson-JsonSerializer或TypeAdapter中的泛型类型_Java_Javafx_Gson - Fatal编程技术网

Java TypeAdapterFactory中的Gson-JsonSerializer或TypeAdapter中的泛型类型

Java TypeAdapterFactory中的Gson-JsonSerializer或TypeAdapter中的泛型类型,java,javafx,gson,Java,Javafx,Gson,我正在尝试为我正在使用的JavaFX类型(不同的属性和可观察对象)编写一个TypeAdapterFactory。对于ObjectProperty,我可以编写一个JsonSerializer/反序列化器,利用对参数化类型的转换,然后获取实际类型参数 这是我用来实现这一目标的代码: public class ObjectPropertySerializer implements JsonSerializer<ObjectProperty>, JsonDeserializer<Obj

我正在尝试为我正在使用的JavaFX类型(不同的属性和可观察对象)编写一个
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]