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

7-对象流

程序员文章站 2024-03-04 15:33:17
...

对象流值得是ObjectInputStream和ObjectOutputStream。

关键点:

1、什么是序列化与反序列化?

  序列化:指把堆内存中的 Java 对象数据,通过某种方式把对象存储到磁盘文件中或者传递给其他网络节点(在网络上传输)。这个过程称为序列化。通俗来说就是将数据结构或对象转换成二进制串的过程

  反序列化:把磁盘文件中的对象数据或者把网络节点上的对象数据,恢复成Java对象模型的过程。也就是将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程

2、为什么要做序列化?

  ①、在分布式系统中,此时需要把对象在网络上传输,就得把对象数据转换为二进制形式,需要共享的数据的 JavaBean 对象,都得做序列化。

  ②、服务器钝化:如果服务器发现某些对象好久没活动了,那么服务器就会把这些内存中的对象持久化在本地磁盘文件中(Java对象转换为二进制文件);如果服务器发现某些对象需要活动时,先去内存中寻找,找不到再去磁盘文件中反序列化我们的对象数据,恢复成 Java 对象。这样能节省服务器内存。

3、Java 怎么进行序列化?

  ①、需要做序列化的对象的类,必须实现序列化接口:Java.lang.Serializable 接口(这是一个标志接口,没有任何抽象方法),Java 中大多数类都实现了该接口,比如:String,Integer

  ②、底层会判断,如果当前对象是 Serializable 的实例,才允许做序列化,Java对象 instanceof Serializable 来判断。

  ③、在 Java 中使用对象流来完成序列化和反序列化

    ObjectOutputStream:通过 writeObject()方法做序列化操作

    ObjectInputStream:通过 readObject() 方法做反序列化操作

4、对象流读写的对象必须实现SeriaLizable接口,否则报错

7-对象流

package com.wlt;

import org.junit.Test;

import java.io.*;

/**
 * 复习对象流
 * Created by wlt on 2018/2/24.
 */
public class ReviewObject {
    @Test
    public void objectoutputstream() throws IOException{
        try (
                ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("objectoutputstream.txt"))
                ) {
            Seriable seriable = new Seriable("张三","黄皮肤");
            objectOutputStream.writeObject(seriable);
        }
    }
    @Test
    public void objectinputstream() throws IOException, ClassNotFoundException {
        try (
                //确保下面的filename所指向的文件存在,否则报错
                ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("objectoutputstream.txt"));
                ) {
            Seriable seriable = (Seriable) objectInputStream.readObject();
            System.out.println(seriable.toString());
        }
    }
}
class Seriable implements Serializable{
    private String name;
    private String skin;

    public Seriable(String name, String skin) {
        this.name = name;
        this.skin = skin;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSkin() {
        return skin;
    }

    public void setSkin(String skin) {
        this.skin = skin;
    }

    @Override
    public String toString() {
        return "Seriable{" +
                "name='" + name + '\'' +
                ", skin='" + skin + '\'' +
                '}';
    }
}

参考:JAVA基础知识之IO——对象序列化

参考:Java IO详解(六)------序列化与反序列化(对象流)

拓展:基于对象流的集合深度拷贝:集合深度拷贝