IO基础(序列化和反序列化)

IO基础(序列化和反序列化)

一、什么是序列化和反序列化

对象序列化:就是将对象保存到磁盘中,或者在网络中传输对象

这种机制就是使用一个字节序列表示一个对象, 该字节序列包含:对象的类型。对象的数据和对象中存储的属性等信息字节序列写到文件之后,相当于文件中持久保存了一个对象的信息

反之,该字节序列还可以从文件中读取回来,重构对象,对它进行反序列化

要实现序列化和反序列化就要使用对象序列化流和对象反序列化流:
●对象序列化流: ObjectOutputStream
●对象反序列化流: ObjectinputStream

二、什么时候需要序列

1、把内存中的对象状态保存到一个文件中或者数据库中时候;
2、 用套接字在网络上传送对象的时候

三、如何实现序列化

对象序列化/反序列化的前提是对象的类要实现Serializable接口.
Serialiable 接口是一个标志接口,没有任何成员.就是告诉编译器可以进行序列化.

一般情况下,类实现了Serializable 接口后,要手动的添加一个序列化版本号字段:

公共类person类 测试序列化和反序列化

import java.io.Serializable;

/**
 * 描述:person类 测试序列化和反序列化
 */
public class Person implements Serializable {
    private static final long serialVersionUID = 1L;
    private String name;

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

    public String getName() {
        return name;
    }

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

    public Person(String name) {

        this.name = name;
    }
}


对象序列化流: ObjectOutputStream

●将Java对象的原始数据类型和图形写入OutputStream, 可以使用ObjectlnputStream读取 (重构)对象。可以通过使用流的文件来实现对象的特久存储。如果流是网络套接字流,则可以在另一个主机上或另一个进程中重构对象

构造方法:

●ObjectOutputStream(OutputStreamout):
创建一个写入指定的Outputstrearm的ObjectOutputStrearm序列化对象的方法:

●. void writeObject(Object obj): 将指定的对象写入ObjectOutputStream

序列化测试类代码如下:

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

/**
 * 描述:把Person类进行序列化
 */
public class Test {
    public static void main(String[] args) throws Exception {
        serializePerson();
    }

    /**
     * 序列化   
     */
    private static void serializePerson() throws IOException {
        Person person = new Person("123");
        // ObjectOutputStream 对象输出流
        // person.txt 文件中,完成对 person 对象的序列化操作    
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File("test01\\person.txt")));
        oos.writeObject(person);
        System.out.println("person 对象序列化成功!");
        oos.close();
    }
}


对象反序列化流: ObjectinputStream

使用ObjectnputStream进行反字列化,简单的理解为把文件中的对象读取出来

反序列化对象的方法:
●ObjectreadObject(): 从ObjectnputStream读取 一个对象

进行反序列化测试代码:

import java.io.*;

/**
 * 描述:进行反序列化
 */
public class Test {
    public static void main(String[] args) throws Exception {
        Person person = deserializePerson();
        System.out.println(person.toString());
    }

    /**
     * 反序列化
     */
    private static Person deserializePerson() throws Exception {
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(new File("e:/person.txt")));
        Person person = (Person) ois.readObject();
        System.out.println("person 对象反序列化成功!");
        return person;
    }

}

四、序列化和反序列化总结

1、一个类如果想被序列化,那么需要实现一个Serializable接口。
2、类中的静态变量的值是不会被进行序列化的,transient 修饰的属性,是不会被序列化的,内置类型 为对应0值。引用类型为null;用transient关键字标记的成员变量不参与序列化过程。

3、在实现这个Serializable 接口的时候,一定要给这个 serialVersionUID 赋值,最好设置为1L,这 个L最好大写来区分,不然小写看起来像是1,不同的 serialVersionUID 的值,会影响到反序列化

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

猜你喜欢

转载自blog.csdn.net/lzh_99999/article/details/104582377