java中的OptionalDataException

package com.n; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; public class S implements Serializable { private static final long serialVersionUID = 1L; transient int i; public static void main(String[] args) throws Exception, IOException { ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("c:\\jav\\f.txt")); S obj1 = new S(10); oos.writeInt(obj1.i); oos.writeObject(obj1); ObjectInputStream ois = new ObjectInputStream(new FileInputStream("c:\\jav\\f.txt")); System.out.println("Object contains >> " + ois.readObject()); System.out.println("Transient variable written separately yields >> i =" + ois.readInt()); } public S(int i) { this.i = i; } @Override public String toString() { return "i= " + i; } } 

上面的代码抛出

  Exception in thread "main" java.io.OptionalDataException at java.io.ObjectInputStream.readObject0(Unknown Source) at java.io.ObjectInputStream.readObject(Unknown Source) at com.nSmain(S.java:27) 

但当我交换输出线时

  System.out.println("Transient variable written separately yields >> i =" + ois.readInt()); System.out.println("Object contains >> " + ois.readObject()); 

它运行良好。 但为什么会这样呢? 我是否必须首先编写并读取序列化的原始值然后读取或写入对象? 什么是OptionalDataException

您需要以与写入ObjectOutputStream时完全相同的顺序读取ObjectInputStream中的数据。

请查看exception的定义: http : //docs.oracle.com/javase/6/docs/api/java/io/OptionalDataException.html

在存储对象之前有一个原语(在对象之前写入int)。 该文件说:

当流中的下一个元素是原始数据时,尝试读取对象。 在这种情况下,OptionalDataException的长度字段设置为可立即从流中读取的原始数据的字节数,并且eof字段设置为false。

所以是的,你需要先阅读。

HTH!