1

我有一个具体的基类,Animal和几个子类DogCat等等。

Dog和的细节Cat无关紧要,所以我想像序列化Animals 一样序列化这些子类的实例。

有很多这样的子类,所以我更喜欢没有列出所有子类的解决方案。基于 an 的东西instanceof Animal将是理想的。

4

2 回答 2

1

(从评论移至完整答案)

如果您不想将子类序列化为那些子类并且只作为父类,只需将子类中的所有字段标记为-transient默认情况下Gson不会序列化它们。

如果您希望能够做到这一点,请使用 Gson@Expose注释标记父类中的所有字段。然后,当您序列化时,您可以使用以下命令选择序列化方式:

Gson gson = GsonBuilder().excludeFieldsWithoutExposeAnnotation().create(); 

当您只希望在 JSON 中表示父类时。

于 2013-02-25T21:50:40.483 回答
0

我天真的 hack,我只是为了好玩而编码(但如果性能不是问题,那值得一试)。

public static void main(String[] args) {
  ArrayList<Animal> al = new ArrayList<Animal>();
  al.add(new Dog());
  al.add(new Fish());
  al.add(new Dog());

  String originalString = new Gson().toJson(al);
  System.out.println(originalString);

  ArrayList<Animal> a = new ArrayList<Animal>();
  Type listType = new TypeToken<List<Animal>>() {}.getType();

  a = new Gson().fromJson(originalString, listType);

  String newString = new Gson().toJson(a);

  System.out.println(newString);

}

结果:

Original string: [{"feet":4,"name":"Dog"},{"canSwim":true,"name":"fish"},{"feet":4,"name":"Dog"}]
New string: [{"name":"Dog"},{"name":"fish"},{"name":"Dog"}]
于 2013-09-14T17:24:33.283 回答