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

序列化: 一个类如果实现了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对象的内容。

扩展 

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

发布了46 篇原创文章 · 获赞 9 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_33238562/article/details/103296119
今日推荐