Java 对象反序列化和序列化时出错
我尝试用抽象类和接口进行对象反序列化和序列化,但序列化不起作用Java 对象反序列化和序列化时出错,java,json,serialization,Java,Json,Serialization,我尝试用抽象类和接口进行对象反序列化和序列化,但序列化不起作用 public class Zoo { @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "sound") @JsonSubTypes({ @JsonSubTypes.Type(value = SoundDog.class, name = "sdog"), @JsonSubTypes.Ty
public class Zoo {
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "sound")
@JsonSubTypes({ @JsonSubTypes.Type(value = SoundDog.class, name = "sdog"),
@JsonSubTypes.Type(value = SoundCat.class, name = "scat"), })
public interface Sound{
String getSound();
}
@JsonTypeName("sdog")
public static class SoundDog implements Sound{
@Override
public String getSound() {
return "gau gau";
}
}
@JsonTypeName("scat")
public static class SoundCat implements Sound{
@Override
public String getSound() {
return "meo meo";
}
}
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
@JsonSubTypes({ @JsonSubTypes.Type(value = Dog.class, name = "dog"),
@JsonSubTypes.Type(value = Cat.class, name = "cat"), })
public static abstract class Animal {
public Animal() {
}
public Animal(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
public void setName(String s) {
this.name = s;
}
public Animal getParent() {
return this.parent;
}
public void setParent(Animal p) {
this.parent = p;
}
public Sound getSound() {
return sound;
}
public void setSound(Sound sound) {
this.sound = sound;
}
private String name;
private Animal parent;
private Sound sound;
}
@JsonTypeName("dog")
public static class Dog extends Animal {
public Dog() {
}
public Dog(String name) {
super(name);
}
}
@JsonTypeName("cat")
public static class Cat extends Animal {
public Cat() {
}
public Cat(String name) {
super(name);
}
}
public static void main(String... args) throws Exception {
Zoo zoo = createZoo();
ObjectMapper mapper = new ObjectMapper();
mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
String json1 = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(zoo);
System.out.println("+++>>>" + json1);
zoo = mapper.readValue(json1, Zoo.class);
String json2 = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(zoo);
System.out.println("Equals: " + json1.equals(json2));
}
private static Zoo createZoo() {
Zoo zoo = new Zoo();
Dog dog1 = new Dog("Dog1");
dog1.setSound(new SoundDog());
Dog dog2 = new Dog("Dog2");
dog2.setSound(new SoundDog());
Cat cat1 = new Cat("Cat1");
Cat cat2 = new Cat("Cat2");
dog2.setParent(dog1);
cat2.setParent(cat1);
zoo.add(dog1);
zoo.add(dog2);
zoo.add(cat1);
zoo.add(cat2);
return zoo;
}
public void add(Animal animal) {
animals.add(animal);
}
public void setAnimals(List<Animal> list) {
this.animals = list;
}
public List<Animal> getAnimals() {
return this.animals;
}
private List<Animal> animals = new ArrayList<Animal>();
}
生成的JSON如下所示:
+++>>>[ "eu.cea.ladis.util.Zoo", {
"animals" : [ "java.util.ArrayList", [ {
"type" : "dog",
"name" : "Dog1",
"parent" : null,
"sound" : {
"sound" : "sdog",
"sound" : "gau gau"
}
}, {
"type" : "dog",
"name" : "Dog2",
"parent" : {
"type" : "dog",
"name" : "Dog1",
"parent" : null,
"sound" : {
"sound" : "sdog",
"sound" : "gau gau"
}
},
"sound" : {
"sound" : "sdog",
"sound" : "gau gau"
}}, {
"type" : "cat",
"name" : "Cat1",
"parent" : null,
"sound" : null
}, {
"type" : "cat",
"name" : "Cat2",
"parent" : {
"type" : "cat",
"name" : "Cat1",
"parent" : null,
"sound" : null
},
"sound" : null
} ] ]
} ]
谁能指导我如何解决我的问题
谢谢你我通过使用抽象类而不是接口解决了我的问题。显示生成的JSONi在我的问题中添加了我生成的JSON。谢谢你。
+++>>>[ "eu.cea.ladis.util.Zoo", {
"animals" : [ "java.util.ArrayList", [ {
"type" : "dog",
"name" : "Dog1",
"parent" : null,
"sound" : {
"sound" : "sdog",
"sound" : "gau gau"
}
}, {
"type" : "dog",
"name" : "Dog2",
"parent" : {
"type" : "dog",
"name" : "Dog1",
"parent" : null,
"sound" : {
"sound" : "sdog",
"sound" : "gau gau"
}
},
"sound" : {
"sound" : "sdog",
"sound" : "gau gau"
}}, {
"type" : "cat",
"name" : "Cat1",
"parent" : null,
"sound" : null
}, {
"type" : "cat",
"name" : "Cat2",
"parent" : {
"type" : "cat",
"name" : "Cat1",
"parent" : null,
"sound" : null
},
"sound" : null
} ] ]
} ]