Natknąłem się na dziwne zachowanie w GSON.Serializing Lista interfejsów GSON
Jeśli mam następujące klasy strukturę:
public interface Animal {
public void nothing();
}
public class Cat implements Animal {
private String name;
public Cat(String name) {
super();
this.name = name;
}
public Cat(){}
@Override
public void nothing() {
// TODO Auto-generated method stub
};
}
public class Dog implements Animal {
private String name;
public Dog(String name) {
super();
this.name = name;
}
public Dog(){}
@Override
public void nothing() {
// TODO Auto-generated method stub
};
}
mogę to zrobić:
ArrayList<Animal> animals = new ArrayList<Animal>();
animals.add(new Cat("Betty"));
animals.add(new Dog("Fred"));
System.out.println(gson.toJson(animals));
i uzyskać ten wynik:
[{"name":"Betty"},{"name":"Fred"}]
Jednakże, jeśli mogę umieścić animals
do klasa zawierająca:
public class Container {
List<Animal> animals = new ArrayList<Animal>();
public void addAnimal(Animal a){
animals.add(a);
}
}
i zadzwonić:
Container container = new Container();
container.addAnimal(new Cat("betty"));
System.out.println(gson.toJson(container));
uzyskać:
{"animals":[{}]}
Wygląda GSON można szeregować listę interfejs List<Interface>
kiedy ta lista jest samo w sobie, ale gdy lista jest zawarta w innej klasie GSON ma problemy.
Każdy pomysł, co robię źle?
Na marginesie mogę poprawnie deserializować ciąg jsonów do poprawnego typu przy użyciu niestandardowego deserializera. To serializacja daje mi problemy.
Dzięki
Zawsze można uzyskać kod źródłowy Gsona i zobaczyć, co faktycznie robi w tej metodzie. –