【问题标题】:Java can't get object to cast from file to arraylistJava 无法将对象从文件转换为数组列表
【发布时间】:2016-05-18 20:39:35
【问题描述】:

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

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

或者这个

线程“主”java.lang.ClassCastException 中的异常: animalkingdom.AnimalBuild 不能转换为 java.util.ArrayList at animalkingdom.AnimalKingdom.readFile(AnimalKingdom.java:146) 在 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";
}
}

【问题讨论】:

  • 您正在将每个单独的对象写入文件。如果你想写List,那么就写List吧。
  • 你不能写出一堆单独的对象,然后期望将它们作为ArrayList读回。
  • 我将我所有的对象都放在一个数组列表中,我希望能够将充满对象的数组列表保存到一个文件中,然后将它们重新加载。我不确定我遵循了什么你们在说。

标签: java object arraylist casting


【解决方案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
}

【讨论】:

  • 谢谢!这很有帮助,你说的很有道理。
【解决方案2】:

一一读取对象,然后添加到列表中。只需颠倒您编写对象的方式即可。查看下面的示例代码:

List<AnimalBuild> animalList  = new ArrayList<AnimalBuild>();
Object obj = null;
while ((obj = ois.readObject()) != null) {
    if (obj instanceof AnimalBuild) {
    AnimalBuild ab = (AnimalBuild) obj;
    animalList .add(ab);
    }
}

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

【讨论】:

    猜你喜欢
    • 2014-12-20
    • 1970-01-01
    • 2021-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-16
    • 2013-09-09
    • 1970-01-01
    相关资源
    最近更新 更多