3

我的代码-

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class ObjectStreamExample {

    /**
     * @param args
     */
    public static void main(String[] args) {

        Person person = new Person();
        person.setFirstName("Abhishek");
        person.setLastName("Choudhary");
        person.setAge(25);
        person.setHouseNum(256);
        ObjectOutputStream stream = null;
        try {
            stream = new ObjectOutputStream(new FileOutputStream(new File("Serialize.txt")));
            stream.writeUTF(person.toString());
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {

            e.printStackTrace();
        }finally{
            if(stream != null)
                try {
                    stream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
        }

        ObjectInputStream input = null;

        try {
            input = new ObjectInputStream(new FileInputStream(new File("Serialize.txt")));

            Person person2 = (Person) input.readObject();
            System.out.println(person2.getFirstName());
            System.out.println(person2.getLastName());
            System.out.println(person2.getAge());
            System.out.println(person2.getHouseNum());
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }finally{
            if(input != null)
                try {
                    input.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
        }


    }

}

和一个 Person bean 文件。

我得到了例外

java.io.OptionalDataException at java.io.ObjectInputStream.readObject0(Unknown Source) at java.io.ObjectInputStream.readObject(Unknown Source) at com.practise.interview.nio.ObjectStreamExample.main(ObjectStreamExample.java:62)

这是因为我认为 -

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

但是如何避免它,因为我知道我设置了一个原始值,所以要避免。?

4

2 回答 2

6

您正在编写 aString并尝试阅读 a Person。这不是序列化的工作方式。在序列化的上下文中,UTF 字符串被认为是原始数据,因为它不包含对象信息(类名、属性等),而仅包含字符串数据。

写出person对象本身,如果你想在Person之后阅读:

stream.writeObject(person);

附录:如果编写 a 的String行为与其他任何 一样Object,您将得到 aClassCastException代替,因为String无法将 转换为Person。无论如何,你写的和你读的不匹配导致了你得到的错误。

于 2012-04-29T08:03:22.007 回答
1

符合规范

异常指示由于未读取的原始数据或流中属于序列化对象的数据结束而导致对象读取操作失败。在两种情况下可能会抛出此异常:

  • 当流中的下一个元素是原始数据时,尝试读取对象。在这种情况下,OptionalDataException 的长度字段设置为可立即从流中读取的原始数据的字节数,并且 eof 字段设置为 false。
  • 试图通过类定义的 readObject 或 readExternal 方法读取数据的末尾。在这种情况下,OptionalDataException 的 eof 字段设置为 true,长度字段设置为 0。

    stream.writeUTF(person.toString()); // 问题就在这里

在这里,您以 UTF 形式编写,而在另一端,您以 Person 对象的形式阅读。你应该改变它 -

stream.writeObject(person);
于 2012-04-29T08:13:37.470 回答