如何在Java中使用ObjectInputStream从文件中读取对象列表?

时间:2014-04-16 07:40:48

标签: java arraylist io objectinputstream objectoutputstream

我有一个数据结构中定义的一些对象列表的列表: 列表> someObject1 = new ArrayList();

我使用函数writeData:

将一些someObject项写入fileXY
void writeData(List <List<Integer>> someObject1, File XY) throws IOException {
    try(ObjectOutputStream outFile = new ObjectOutputStream(new FileOutputStream(XY,true)))
    outFile.writeObject(someObject1);
    }
    catch( IOException ex) { ex.printStackTrace(); } 
}

现在我尝试使用函数readData读取它:

void readData(File XY) throws IOException {
    try (ObjectInputStream inFile=new ObjectInputStream(new FileInputStream(XY))) {
    List <List <MyClass>> someObject2=(List <List <MyClass>>)inFile.readObject();
    }
catch( IOException ex) { ex.printStackTrace(); } 
}

但它给了我错误:

java.io.OptionalDataException
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1363)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:371)

任何人都可以帮助我。在阅读这个数据结构时,演员是否有问题?

如果它只是一个对象列表,我可以通过使用

强制转换readObject()来读取它
(List<MyClass>).

为什么同样的事情不适用于对象列表?

这是MyClass的概述:

public class MyClass implements Serializable {
private long aa;    
private List <Integer> bb;
public MyClass(long a,List <Integer> b) {
    aa=a;
    bb=b;         
}
public long getA() {    
    return aa;
}         

public List<Integer> getB () {
   return bb; 
} 

}

1 个答案:

答案 0 :(得分:1)

这绝对适用于我:

public static final String FILE = "file.b";

public static class MyClass implements Serializable {
    private long aa;
    private List<Integer> bb;

    public MyClass(long a, List<Integer> b) {
        aa = a;
        bb = b;
    }
}

public static void main(String[] args) throws FileNotFoundException, IOException,
        ClassNotFoundException {
    List<List<MyClass>> list = new ArrayList<>();
    list.add(new ArrayList<>());
    list.get(0).add(new MyClass(5, new ArrayList<>()));

    ObjectOutputStream outFile = new ObjectOutputStream(new FileOutputStream(new File(FILE)));
    outFile.writeObject(list);
    outFile.close();

    ObjectInputStream inFile = new ObjectInputStream(new FileInputStream(new File(FILE)));
    List<List<MyClass>> list2 = (List<List<MyClass>>) inFile.readObject();
    System.out.println(list2);
}

注意:即使我没有将任何 MyClass 添加到 list.get(0) ,即使我不要将列表添加到 list

我想到了几个可能导致问题的原因:

  • 写入后忘记关闭输出流
  • 您没有在文件中的正确位置读取对象。如果有多个对象写入文件,则必须按照写入的顺序读取它们。
  • 您的问题在于自定义类

<强>更新

也许您在序列化类MyClass中使用了非序列化属性。如果是这样,您应该覆盖writeObject()readObject()以正确序列化/反序列化您班级的此类属性。

看看这个: http://marxsoftware.blogspot.fr/2014/02/serializing-java-objects-with-non.html