什么是Java的序列化流?

未分类 1个月前 MarkSun
53 0 0
就聊挣钱

1 什么是序列化?

序列化:把对象以流的方式写入到文件中保存。与之相反的操作就是反序列化,就是把文件中保存的对象,以流的方式读取出来使用。

2 序列化与反序列

2.1 对象序列化:ObjectOutputStream

java.io.ObjectOutputStream:对象的序列化流 extends OutputStream。作用:把对象以流的方式写入到文件中保存

构造方法:

  • ObjectOutputStream(OutputStream out) 初始化序列化输出流:参数是输出流的子类对象

共性方法: 字节输出流有的方法,它都有。

特有方法: 对象写入硬盘文件:writeObject(Object obj)

注意:

  1. 进行序列化和反序列化,必须要实现Serializable接口,标记当前接口可以被序列化或反序列化。
  2. 所有属性必须是可序列化的。如果不需要序列化,该属性必须注明是瞬态的,被transient关键字修饰

2.2 对象反序列化:ObjectInputStream

java.io.ObjectInputStream:对象的反序列化流 extends InputStream。作用:把文件中保存的对象以流的方式读取出来使用

构造方法: 初始化序列化输入流,参数字节输入流子类对象:ObjectInputStream(InputStream in)

特有方法: 读取硬盘文件中存储的对象数据 readObject()

注意:反序列化对象的类必须实现序列化接口

案例:将内存对象写入磁盘,再从磁盘将文件读入内存

/**
 * 对象序列化流ObjectOutputStream
 * 
 * 特有方法:对象写入硬盘文件:writeObject(Object obj)
 */
public class Demo23SerializableCollection {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        //1.创建对象的序列化流,绑定文件保存对象的数据
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.txt"));
        //2.向文件写入多个对象
        oos.writeObject(new Person("张三", 12));
        //3.关闭流
        oos.close();

    }
}
/**
 * 对象反序列化流:ObjectInputStream
 * 作用:将硬盘中序列化的对象,再次读取到内存中来
 * 常用方法:字节流有什么,它就有什么。
 * 特有方法:将对象读取到内存中来。readObject();
 * 注意:
 *  1.想进行对象的反序列化,必须实现序列化的接口
 *
 */
public class Demo22Serializable {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        //三步走:
        //1.创建反序列化流的对象,绑定对象序列化问person.txt
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.txt"));
        //2.通过流的方法读取对象,readObject()
        Object o = ois.readObject();
        //对象的数据类型是person的类型,可以进行强转
        Person p = (Person) o;
        System.out.println("p = " + p);//
        //3.关闭流,释放资源
        ois.close();
    }
}

transient:瞬态关键字,被transient关键修饰的变量不能被序列化。

    /**
     * transient 瞬态关键字,作用声明当前属性不需要序列化!
     */
    private transient int age;
public class Person implements Serializable {
    //属性
    private String name;
    private int age;
    //空参数构造
    //满参数构造
    //getter和setter方法
}

小结

了解更多Java面试相关资料,

请访问shimo.im/docs/N2A1MBV81dIeZ6AD/

版权声明:MarkSun 发表于 2022年12月31日 下午10:53。
转载请注明:什么是Java的序列化流? | 24k导航

相关文章

暂无评论

暂无评论...