我有一个数据结构中定义的一些对象列表的列表: 列表> someObject1 = new ArrayList();
我使用函数writeData:
将一些someObject项写入fileXYvoid 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;
}
}
答案 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