ObjectInputStream类

本文详细介绍了Java中的ObjectInputStream类如何实现对象反序列化,包括构造方法、基本操作以及可能出现的ClassNotFoundException和InvalidClassException异常情况。特别强调了Serializable接口和serialVersionUID在序列化版本控制中的作用。
摘要由CSDN通过智能技术生成

3.3 ObjectInputStream类

ObjectInputStream反序列化流,将之前使用ObjectOutputStream序列化的原始数据恢复为对象。

构造方法

  • public ObjectInputStream(InputStream in) : 创建一个指定InputStream的ObjectInputStream。

反序列化操作1

如果能找到一个对象的class文件,我们可以进行反序列化操作,调用ObjectInputStream读取对象的方法:

  • public final Object readObject () : 读取一个对象。
public class DeserializeDemo {
   public static void main(String [] args)   {
        Employee e = null;
        try {		
             // 创建反序列化流
             FileInputStream fileIn = new FileInputStream("employee.txt");
             ObjectInputStream in = new ObjectInputStream(fileIn);
             // 读取一个对象
             e = (Employee) in.readObject();
             // 释放资源
             in.close();
             fileIn.close();
        }catch(IOException i) {
             // 捕获其他异常
             i.printStackTrace();
             return;
        }catch(ClassNotFoundException c)  {
        	// 捕获类找不到异常
             System.out.println("Employee class not found");
             c.printStackTrace();
             return;
        }
        // 无异常,直接打印输出
        System.out.println("Name: " + e.name);	// zhangsan
        System.out.println("Address: " + e.address); // beiqinglu
        System.out.println("age: " + e.age); // 0
    }
}

对于JVM可以反序列化对象,它必须是能够找到class文件的类。如果找不到该类的class文件,则抛出一个 ClassNotFoundException 异常。

反序列化操作2

**另外,当JVM反序列化对象时,能找到class文件,但是class文件在序列化对象之后发生了修改,那么反序列化操作也会失败,抛出一个InvalidClassException异常。**发生这个异常的原因如下:

  • 该类的序列版本号与从流中读取的类描述符的版本号不匹配
  • 该类包含未知数据类型
  • 该类没有可访问的无参数构造方法

Serializable 接口给需要序列化的类,提供了一个序列版本号。serialVersionUID 该版本号的目的在于验证序列化的对象和对应类是否版本匹配。

public class Employee implements java.io.Serializable {
     // 加入序列版本号
     private static final long serialVersionUID = 1L;
     public String name;
     public String address;
     // 添加新的属性 ,重新编译, 可以反序列化,该属性赋为默认值.
     public int eid; 

     public void addressCheck() {
         System.out.println("Address  check : " + name + " -- " + address);
     }
}
  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: ObjectInputStreamJava中的一个,它提供了一些方法来读取对象的二进制表示。以下是ObjectInputStream的一些方法: 1. readObject():读取一个对象。 2. readBoolean():读取一个布尔值。 3. readByte():读取一个字节。 4. readChar():读取一个字符。 5. readDouble():读取一个双精度浮点数。 6. readFloat():读取一个单精度浮点数。 7. readInt():读取一个整数。 8. readLong():读取一个长整数。 9. readShort():读取一个短整数。 10. readUTF():读取一个UTF-8编码的字符串。 这些方法可以帮助我们读取对象的二进制表示,并将其转换为Java对象。 ### 回答2: ObjectInputStreamJava标准库中提供的一个输入流操作,它主要用于反序列化对象。 ObjectInputStream提供了多个方法,其中一些常用方法如下: 1. readObject():用于读取对象,返回一个Object型的数据。可以将该数据强制转换为期望的对象型。 2. readInt():用于读取一个int型的数据。 3. readLong():用于读取一个long型的数据。 4. readFloat():用于读取一个float型的数据。 5. readDouble():用于读取一个double型的数据。 6. readBoolean():用于读取一个boolean型的数据。 7. readByte():用于读取一个byte型的数据。 8. readChar():用于读取一个char型的数据。 9. readShort():用于读取一个short型的数据。 10. readUnsignedByte():用于读取一个无符号的byte型的数据。 11. readUTF():用于读取一个UTF-8编码的字符串。 除了以上列举的方法,ObjectInputStream还有其他一些用于读取不同型数据的方法。在使用这些方法时,需要注意的是读取的数据型应该与写入数据时使用的方法一致,否则可能会引发数据型转换错误或数据损坏。 总之,ObjectInputStream的方法主要用于从输入流中读取各种型的数据,特别是用于反序列化对象。通过使用这些方法,我们可以将一个序列化后的对象重新还原为原来的对象,并进行后续的操作。 ### 回答3: ObjectInputStreamJava.io包中的一个,它允许在Java应用程序中以对象的形式读取和反序列化数据。下面是ObjectInputStream的一些常用方法: 1. void close():关闭ObjectInputStream流,并释放相关的资源。 2. int available():返回可以从输入流中读取而不会阻塞的字节数。 3. int read():从输入流中读取下一个字节的数据,并返回其数值。如果已达到文件的结尾,则返回-1。 4. int read(byte[] buffer):从输入流中最多读取buffer.length个字节的数据,存储在buffer数组中。 5. Object readObject():从输入流中读取下一个对象,并将其反序列化。返回的对象必须强制转换为其实际的。 6. boolean readBoolean():从输入流中读取一个布尔值,并返回其值。 7. byte readByte():从输入流中读取一个字节的数据,并返回其值。 8. char readChar():从输入流中读取一个字符的数据,并返回其值。 9. double readDouble():从输入流中读取一个双精度浮点数的数据,并返回其值。 10. long readLong():从输入流中读取一个长整型数据,并返回其值。 通过使用这些方法,ObjectInputStream可以方便地读取和反序列化对象。使用该可以将对象从文件或网络传输中读取出来,并在程序中进行处理和使用。同时,读取出的对象还可以根据需要进行型转换和操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值