Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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
JavaGSON-序列化&;使用泛型类型列表反序列化类_Java_List_Generics_Gson_Deserialization - Fatal编程技术网

JavaGSON-序列化&;使用泛型类型列表反序列化类

JavaGSON-序列化&;使用泛型类型列表反序列化类,java,list,generics,gson,deserialization,Java,List,Generics,Gson,Deserialization,示例类: public class A { String Name; List<B> GenericsList; //Getters & Setters & Constructors } public class B { String Title; //Getters & Setters & Constructors } public class C extends B { String Somethi

示例类:

public class A
{
    String Name;
    List<B> GenericsList;

    //Getters & Setters & Constructors
}

public class B
{
   String Title;
   //Getters & Setters & Constructors
}

public class C extends B
{
    String Something;
    //Getters & Setters & Constructors
}
公共A类
{
字符串名;
列表泛型列表;
//getter、setter和constructor
}
公共B级
{
字符串标题;
//getter、setter和constructor
}
公共类C扩展到B
{
串东西;
//getter、setter和constructor
}
如果我像这样序列化类A的实例:

List<B> bList = new ArrayList<>();
C bObj = new C("name", "something text");
bList.add(bObj);

A aObj = new A("name", bList);

String serialized = new Gson.toJson(aObj);

A deserializedA = new Gson.fromJson(serialized);
Gson gson = new Gson();
List<B> bList = new ArrayList<>();

Type bType = new TypeToken<List<B>>() {}.getType();
gson.toJson(bList, bType);

gson.fromJson(json, bType);
Gson gson = new GsonBuilder()
            .registerTypeHierarchyAdapter(B.class, new BGsonAdapter())
            .setPrettyPrinting()
            .create();

String serialized = gson.toJson(A);

A deserialized = (A)gson.fromJson(A);
List bList=new ArrayList();
C bObj=新的C(“名称”、“文本”);
bList.add(bObj);
A aObj=新的A(“名称”,bList);
String serialized=new Gson.toJson(aObj);
A反序列化da=new Gson.fromJson(序列化);
我丢失了列表中的C子类型。 我知道如何解决这个问题,如果它只是一个要序列化的列表,如下所示:

List<B> bList = new ArrayList<>();
C bObj = new C("name", "something text");
bList.add(bObj);

A aObj = new A("name", bList);

String serialized = new Gson.toJson(aObj);

A deserializedA = new Gson.fromJson(serialized);
Gson gson = new Gson();
List<B> bList = new ArrayList<>();

Type bType = new TypeToken<List<B>>() {}.getType();
gson.toJson(bList, bType);

gson.fromJson(json, bType);
Gson gson = new GsonBuilder()
            .registerTypeHierarchyAdapter(B.class, new BGsonAdapter())
            .setPrettyPrinting()
            .create();

String serialized = gson.toJson(A);

A deserialized = (A)gson.fromJson(A);
Gson-Gson=new-Gson();
List bList=new ArrayList();
类型bType=newTypeToken(){}.getType();
toJson(bList,bType);
fromJson(json,bType);
问题是,我的泛型列表位于具有其他参数的对象内。我该怎么做

编辑1: 也许我不清楚具体的问题

当我序列化和反序列化上面创建的对象时,没有错误,而是得到以下结果: 对象A: Name=“Name” GenericsList={Object C}

我得到: 对象A: Name=“Name” GenericsList={Object B}


我丢失了子类型C的详细信息。

明白了!谢谢你的提示Sotirios Delimanolis

必须为B类创建自定义实现:

class BGsonAdapter implements JsonSerializer<B>, JsonDeserializer<B>
{
    public JsonElement serialize(B bObj, Type typeOfSrc, JsonSerializationContext context)
    {
        JsonObject result = new JsonObject();
        result.add("Title", context.serialize(B.getTitle(), String.class));

        if (bObj instanceof C)
        {
            result.add("Something", context.serialize(((C)bObj).getSomething(), String.class));
        }

        return result;
    }

    public B deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException
    {
        JsonObject object = json.getAsJsonObject();
        B result = null;

        if (object.has("Something"))
        {
            result = new C();
            ((C) result).setSomething((String)context.deserialize(object.get("Something"), String.class));

        if (result == null)
        {
            result = new B();
        }
        result.setTitle(((String)context.deserialize(object.get("Title"), String.class)));

        return result;
    }
}

你能发布一个完整的例子和预期的结果吗?请详细说明你所看到的行为和你所问的问题。你应该阅读。没有帮助。问题是我想要反序列化的对象中有一个泛型类型列表。找不到任何具体的答案。。。。