Java无法获取从文件转换为arraylist的对象

时间:2016-02-09 01:06:55

标签: java object arraylist casting

我正在尝试从文件中加载对象。我首先通过保存对象来创建文件。如果我只将一个对象保存到文件中,我可以通过将对象转换为变量而不是arraylist来加载它。但是,如果我尝试将多个对象转换为arraylist,我会不断出错。我有时会得到这个:

  

animalkingdom.AnimalBuild;本地类不兼容:stream classdesc   serialVersionUID = 8814442576780984798,本地类serialVersionUID =   -7073710162342893881

或者

  

线程“main”中的异常java.lang.ClassCastException:   animalkingdom.AnimalBuild无法转换为java.util.ArrayList at   animalkingdom.AnimalKingdom.readFile(AnimalKingdom.java:146)at   animalkingdom.AnimalKingdom.main(AnimalKingdom.java:123)Java结果:   1

写函数

  // function to write object to file
       public static void writeToFile(ArrayList<AnimalBuild> a) throws    IOException  { 
        ObjectOutputStream oos = new ObjectOutputStream (new FileOutputStream("animal2.txt"));

        for (AnimalBuild s : a) { // loop through and write objects to file. 
            oos.writeObject(s);
        }
    }

阅读功能

  // function to read from file
     public static void readFile() throws IOException, ClassNotFoundException {
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("animal2.txt"));

       @SuppressWarnings("unchecked") 
       ArrayList<AnimalBuild> animalList = (ArrayList<AnimalBuild>)ois.readObject(); // casting object

        Iterator it = animalList.iterator();

        while(it.hasNext()) {
         String obj = (String)it.next();
         System.out.println(obj);
    }      
}

动物构建

class AnimalBuild implements Serializable {
private static final long serialVersionUID = 8814442576780984798L;
//private static final long serialVersionUID = -12049485535619732L;


public String Animaltype, Species, Color;
public AnimalBuild (String animaltype , String species, String color )
{
    this.Animaltype = animaltype;
    this.Species = species;
    this.Color = color;
}

public String getType() {
    return this.Animaltype;
}
public String getSpecies() {
    return this.Species;
}
public String getColor() {
    return this.Color;
}

public String setType(String newType) {
    return (this.Animaltype=newType);
}

public String setSpecies(String newSpecies) {
    return (this.Species=newSpecies);
}

public String setColor(String newColor) {
    return (this.Color=newColor);
}

public String toString ()
{
    return "\n\n Animal Type: " + this.Animaltype + "\n Species: "  + this.Species + "\n Color: " + this.Color + "\n";
}
}

2 个答案:

答案 0 :(得分:1)

序列化数据时,需要以兼容方式读取数据。您正在单独编写每个元素,以便阅读本文,您需要单独阅读它们。

但是,编写列表更简单。

try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("animal2.txt"))) {
    oos.writeObject(a);
}

阅读清单

List<AnimalBuild> animalList;
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("animal2.txt"))) {
     animalList = (List<AnimalBuild>) ois.readObject(); // casting object
}

答案 1 :(得分:0)

逐个阅读对象,然后添加到列表中。只需改变编写对象的方式。检查下面的示例代码:

r0

您可以将整个列表作为一个对象写入文件,然后将其作为同一个对象读回,而不是逐个写入。