java中的OptionalDataException

Nav*_*Nav 5 java

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;
    }

}
Run Code Online (Sandbox Code Playgroud)

上面的代码抛出

 Exception in thread "main" java.io.OptionalDataException
    at java.io.ObjectInputStream.readObject0(Unknown Source)
    at java.io.ObjectInputStream.readObject(Unknown Source)
    at com.n.S.main(S.java:27)
Run Code Online (Sandbox Code Playgroud)

但当我交换输出线时

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

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

Ted*_*opp 9

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

  • @Nav尝试在读取文件之前关闭oos。当我在写入之后添加oos.close()时,您的代码对我有用(在反转读取顺序或写入顺序之后)。 (2认同)