【问题标题】:Serializing and deserializing an ArrayList of interfaces序列化和反序列化接口的 ArrayList
【发布时间】:2013-09-05 01:15:33
【问题描述】:

我有一个接口,Item。对象ProductCategory 实现Item。我有一个ArrayList<Item> 我需要序列化和反序列化。我尝试使用 Gson,但它不支持接口的序列化和反序列化。我能做什么? (也许和 Gson 一起)

【问题讨论】:

标签: java android serialization deserialization gson


【解决方案1】:

您需要为这些类创建一个序列化程序。

我使用了 Gson。我所做的是创建一个 JSONValueSerializer 类和接口 IJSONValueSerializer(使用一种方法 toJsonString())。然后我在创建的 JSONValueSerializer 类上实现了 JsonSerializer。

现在我所要做的就是在我想要序列化的任何类上实现接口,并且我有一个用于类似类的通用序列化程序。因此,在您的情况下,您可以在 Item 上实现此类,并且序列化程序将告诉它在 GsonBuilder 注册时如何序列化 Product 和 Category。

private class JSONValueSerializer implements JsonSerializer<IJSONValueSerializer> {
  public JsonElement serialize(IJSONValueSerializer src, Type typeOfSrc, JsonSerializationContext context) {
    return new JsonPrimitive(src.toJsonString());
  }
}

然后创建 GsonBuilder 并注册任何将被序列化的类。

GsonBuilder gson = new GsonBuilder();
gson.registerTypeAdapter(MyClass.class, new JSONValueSerializer());
gson.create().toJson(someObjectContainingMyClass);

https://sites.google.com/site/gson/gson-user-guide#TOC-Custom-Serialization-and-Deserialization

【讨论】:

  • 我不明白。我的Product 有一个字符串、一个整数和一个类别,我的类别有一个字符串和一个整数。你能提供一个代码示例吗?
  • 您是否要序列化为 json?
  • 我刚试过Gson.fromJson(reader, new TypeToken&lt;ArrayList&lt;Item&gt;&gt;(){}.getType());,还是不行。我不知道你的意思是我应该在序列化方法中做什么。
  • 啊,我现在明白了。看看这个:*.com/questions/5952595/…
  • 顺便问一下,IJSONValueSerializer,Item 或者ProductCategory 应该实现什么?
最近更新 更多