14.0、Java_IO流 - 对象流、序列化与反序列化

14.0、Java_IO流 - 对象流、序列化与反序列化

对象流:

        对象的本质是用来组织和存储数据的,对象本身也是数据;那么,能不能将对象存储到硬盘上的文件中呢?能不能将对象通过网络传输到另一个电脑呢?我们呢可以通过序列化和反序列化来实现这写需求;

序列化和反序列化是啥?

        当两个进程远程通信时,彼此可以发送各种类型的数据;无论是何种类型的数据,都会以二进制序列的形式在网络上传送;比如,我们可以通过 http 协议发送字符串信息;我们也可以在网络上直接发送 Java 对象;发送方需要这个 Java 对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为 Java 对象才能正常读取;

        把 Java 对象转换为字节序列的过程称为 对象的序列化;把字节序列恢复为 Java 对象的过程称为 对象的反序列化

对象序列化的作用有如下两种:

        持久化:把对象的字节序列永久的保存到硬盘上,通常存放在一个文件中;

        网络通信:在网络上传送对象的字节序列;比如:服务器之间的数据通信,对象传递; 

序列化设计的类和接口:

        ObjectOutputStream 代表对象输出流 ( 他是一个处理流 ),他的 writeObject(Object obj) 方法可对参数指定的 obj 对象进行反序列化,把得到的字节序列写到一个目标输出流中;

        ObjectInputStream 代表对象输入流( 他是一个处理流 ),他的 readObject() 方法从一个源输入流中读取字节序列,再把他们反序列化为一个对象,并将其返回;

        只有实现了 Serializable 接口的类的对象才能被序列化;Serializable 接口是一个空接口,只起到标记作用;

下面来看两个示例代码 ->

1. 利用对象流写出基本数据类型,然后通过对象流从写出的文件中再将数据读取回来,代码如下所示 ->

public class Demo8 {
    public static void main(String[] args) throws IOException {
        ObjectOutputStream oos= new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream("D:/text1.txt")));
        oos.writeInt(1);
        oos.writeFloat((float)15.99);
        oos.writeUTF("蓝色海湾");
        oos.writeBoolean(true);
        oos.flush();
        //直接读取数据,注意:读取的顺序要与写入的一致,否则不能正确读取
        ObjectInputStream ois = new ObjectInputStream(new BufferedInputStream(new FileInputStream("D:/text1.txt")));
        System.out.println("char = " + ois.readInt());
        System.out.println("float = " + ois.readFloat());
        System.out.println("String = " + ois.readUTF());
        System.out.println("boolean = " + ois.readBoolean());
    }

 2. 利用对象流将对象序列化与反序列化字节文件恢复对象数据 ->

        注意 :objectOutputStream 可以将一个内存中的 Java 对象通过序列化的方式写入到磁盘的文件中;被序列化的对象必须要实现 Serializable 序列化接口,否则会抛出异常;

代码如下所示 ->

public class Demo9 {
    public static void main(String[] args) throws Exception {
        ObjectOutputStream oos = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream("D:/file.dat")));
        Student student = new Student("澜色海湾",(short)22,'男',173,115);
        //将 student 对象序列化之后存储到 D盘下的 file.dat 文件中,实现持久化
        oos.writeObject(student);
        oos.flush();
        //将序列化成字节文件的 Student 对象再反序列化将数据取出
        ObjectInputStream ois = new ObjectInputStream(new BufferedInputStream(new FileInputStream("D:/file.dat")));
        Student student1  = (Student)ois.readObject();
    }
}

你可能感兴趣的:(Java_IO流学习总结,Java,JavaIO流,对象流,序列化,反序列化)