java - 由于原始 int 值而获取 OptionalDataException,但如何在 JAVA 中避免它

标签 java serialization io datainputstream

我的代码-

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)

这个问题被提出来是因为我认为 -

An attempt was made to read an object when the next element in the stream is primitive data. In this case, the OptionalDataException's length field is set to the number of bytes of primitive data immediately readable from the stream, and the eof field is set to false.

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

最佳答案

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

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

stream.writeObject(person);

附录:如果编写一个 String 的行为与任何其他 Object 一样,您将得到一个 ClassCastException相反,因为 String 无法转换为 Person。无论如何,您所写内容和所阅读内容之间的不匹配导致了您遇到的错误。

关于java - 由于原始 int 值而获取 OptionalDataException,但如何在 JAVA 中避免它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10370616/

相关文章:

java - 如何在 Jersey-Test 中发布 JSON 请求

java - 无法使用PreparedStatement在Phoenix中插入行

java - CAS JpaTicketRegistry 不工作

java - 在第 1 行的 'update, stock_id) values (0, 0.0, 10018, 1, null, 0, null, 0)' 附近使用正确的语法

java - 重复类 : MainActivity

java.io.NotSerializedException 问题

javascript - Jquery的表单序列化发送重复信息

java - 如果属性文件中的值可能会发生变化怎么办?

c++ - 是否有必要让同一个QDomDocument创建的QDomElement来编写XML?

c - 在c中打开并写入文本