ObjectInputStream

ObjectInputStream

介绍

public class ObjectInputStream extends InputStream
ObjectInputStream反序列化先前使用ObjectOutputStream编写的原始数据和对象。
ObjectInputStream(InputStream in)
创建从指定的InputStream读取的ObjectInputStream。
参数:
InputStream in:字节输入流
特有方法:
public final Object readObject()
从ObjectInputStream读取一个对象。 读取对象的类,类的签名以及类的非瞬态和非静态字段的值以及其所有超类型。
使用步骤:
1.创建ObjectInPutStream对象,构造方法中传递字节输入流
2.使用ObjectInPutStream对象中的方法readobject,把到文件中的读取写入
3.释放资源

代码块

public class Demo02ObjectInputStream {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        ObjectInputStream ois=new ObjectInputStream(new FileInputStream("cn\\itcast\\IO\\Serializable\\Object.txt"));
        Object o;
        while ((o=ois.readObject())!=null)//解决EofException再后面增加了一个null的空对象,参考https://blog.csdn.net/xq328220454/article/details/6523489
        {
            System.out.println(((Person)o).getName()+"的年龄是:"+((Person)o).getAge());
            /*任何尝试读取超过相应writeObject方法写入的自定义数据边界的对象数据将导致使用eof字段值为true的抛出OptionalDataException。
            超过分配数据结束的非对象读取将以与指示流结尾相同的方式反映数据的结尾:
            Bytewise读取将返回-1作为字节读取或读取的字节数,并且原语读取将抛出EOFExceptions。
          如果没有相应的writeObject方法,则默认序列化数据的结尾标记分配的数据的结尾。*/
        }
        ois.close();
    }/*只有支持java.io.Serializable接口的对象才能写入流中。*/
}

ps:

Exception in thread “main” java.io.InvalidClassException: cn.itcast.IO.Serializable.Person在序列化之后修改对象类文件,反序列化失败

  • 序列化运行时将每个可序列化的类与称为serialVersionUID的版本号相关联,该序列号在反序列化期间用于验证序列化对象的发送者和接收者是否已加载与该序列化兼容的对象的类。
  • 如果接收方加载了一个具有不同于相应发件人类的serialVersionUID的对象的类,则反序列化将导致InvalidClassException 。
  • 一个可序列化的类可以通过声明一个名为"serialVersionUID"的字段来显式地声明它自己的serialVersionUID,该字段必须是静态的,最终的,类型是long :
  • ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L;

猜你喜欢

转载自blog.csdn.net/tangshuai96/article/details/104301100