欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

浅谈Serializable序列化接口类,以及ObjectOutputStream 输出流和ObjectInoutStream  输入流的使用

程序员文章站 2024-03-07 08:14:08
...

序列化: 一个类如果实现了Serializable接口,那么这个类创建的对象就是序列化的对象

需要序列化的三种情况: 1. 将对象存储在硬盘上。 2. 将对象通过网络传输。 3. 通过RMI远程调用等方式传输对象的时候。

作用:     Serializable主要作用将类的实例持久化保存,

               1、序列化就是保存,也就是将Java对象转换为字节序列的过程

               2、反序列化就是读取,也就是把字节序列恢复为Java对象的过程

              保存也不一定保存在本地,也可以保存到远方。类一定要实现Serializable才可以
实现序列化条件:
       1、 该类必须实现 java.io.Serializable 接口, Serializable 是一个标记接口,不实现此接口的类将不会使任何状态序列化或·                     反序列化,会抛出 NotSerializableException 。
  2、 该类的所有属性必须是可序列化的。如有属性不需要可序列化,则该属性必须注明是瞬态的,用transient 关键字修饰。

import lombok.Data;
import lombok.ToString;
import java.io.Serializable;

@Data
@ToString
public class CsStudent implements Serializable {
    private String name;
    private int age;
    public CsStudent(String name,int age){
        this.name=name;
        this.age=age;
    }
    @Override
    public String toString()
    {
        return name+":"+age;
    }
}

 如何实现序列化和反序列化:

  1、ObjectOutputStream --> 对象的输出流

        实现方法-->writeObject(Object obj) --> 对obj对象进行序列化


  2、ObjectInoutStream  --> 对象的输入流

        实现方法-->readObject() --> 读取字节序列,再将它们反序列化成为一个对象返回

// 示例一


 // 获取桌面路径
        FileSystemView fsv = FileSystemView.getFileSystemView();
        File com=fsv.getHomeDirectory();

// 步骤一:创建一个序列化流ObjectOutputSteam对象(存储到一个文件)
   ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(com.getPath()+"\\student.txt"));
            // 步骤二:写入对象
            oos.writeObject(new CsStudent("小懒",18).toString());
            oos.flush();// 先请缓存
            oos.close();// 再关闭

            // 步骤一:读取指定的文件 反序列化,将该对象恢复
            ObjectInputStream ois=new ObjectInputStream(new FileInputStream(com.getPath()+"\\student.txt"));
            // 步骤二:读取对象
            String s = (String)ois.readObject();
            System.out.println(s); // 输出: 小懒:18
            ois.close();

// 示例二

ByteArrayOutputStream baos=new ByteArrayOutputStream();
            for(int i=0;i<5;i++){
                baos.write(i);
            }
            baos.flush();
            byte b []= baos.toByteArray();// 输出 [0, 1, 2, 3, 4]
            // 将内存中的数据读取出来
            ByteArrayInputStream bais = new ByteArrayInputStream(b);
            // byte必须传递 内存中的数据转成 byte数组的格式,而不能直接传递一个空数组, 读取出来的数据也是空的
            byte[] b2 = new byte[b.length];
            System.err.println(Arrays.toString(b2));// 输出[0, 1, 2, 3, 4]

关于序列化 ObjectOutputStream 中文乱码问题: 因为序列化后生成对象输出的本就是字节数据 ObjectOutputStream.writeObject()的作用是把一个实例的对象以文件的形式保存到磁盘上, 这个过程就叫Java对象的持久化。而这个文件是以二进制的形式编写的, 当你用文本编辑器将它打开,这些二进制代码与某个字符集映射之后,显示出来的东西就成了乱码。 即使输出的是一个String的对象,也是以该String对象的二进制编码的形式输出,而不是输出String对象的内容。

 

扩展 

浅谈Serializable序列化接口类,以及ObjectOutputStream 输出流和ObjectInoutStream  输入流的使用

关于IO流的介绍及使用,感兴趣的话可以借鉴下这篇博客:https://blog.csdn.net/qq_42914528/article/details/82260537