Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.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
Java 对象反序列化和序列化时出错_Java_Json_Serialization - Fatal编程技术网

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
  } ] ]
} ]