关于JAVA对象的序列化与反序列化的学习与理解

关于JAVA对象的序列化与反序列化的学习与理解

一、什么是序列化

序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。

简单来说,序列化就是一种将对象转成字节方便传送到别处或存储在硬盘上,并且再从转化成的字节重构对象的机制。

二、如何序列化

将需要被序列化的类实现Serializable接口,该接口没有需要实现的法, implements Serializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Objectobj)方法就可以为obj的对象写出(即保存其状态),要恢复的话则用输入流。

三、简单的实现

先写一个Person类实现Serializable接口

import java.io.Serializable;

/**
 * @desc:实现Serializable接口
 * @author: Qroxy
 * @QQ:1114031075
 * @时间: 2018/11/3-12:29 PM
 */
public class Person implements Serializable {
    private String name;
    private int age;
    private String sex;
    public Person(String name, int age, String sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }
    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", sex='" + sex + '\'' +
                '}';
    }
}

四、进行序列化与反序列化

现在创建一个存储流的文件(test.txt)

import java.io.*;

/**
 * @desc:序列化与反序列化
 * @author: Qroxy
 * @QQ:1114031075
 * @时间: 2018/11/3-12:29 PM
 */
public class Serializable {

    private static void SerializePerson() throws FileNotFoundException, IOException {


        Person person = new Person("镇权", 22, "男");
        ObjectOutputStream oo = new ObjectOutputStream(new FileOutputStream("/Users/chun/我的项目/测试/test.txt"));
        oo.writeObject(person);
        System.out.println("Person对象序列化成功!");
        oo.close();
    }
//记得对错误抛出处理,以便出现错误快速定位
    private static Person DeserializePerson() throws FileNotFoundException, IOException {

        ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("/Users/chun/我的项目/测试/test.txt"));
        Person person = null;
        try {
            person = (Person) objectInputStream.readObject();
            System.out.println("Person对象反序列化成功!");

        } catch (ClassNotFoundException e) {
            new RuntimeException(e);
        }

        return person;
    }
//写个主函数运行看一下效果
    public static void main(String[] args) throws Exception {
        SerializePerson();
        Person person = DeserializePerson();
        System.out.println(person);
    }
}

运行结果:
image.png

再打开test.txt文件可以看到一堆16进制编码:
image.png

以上就就是序列化与反序列化的实现。
值得注意的是,如果报以下错误即对象没有继承Serializable接口。
image.png

当不想某个成员变量被序列化的话可以加transient关键字,当反序列化时该值就会为null。

五、Java IO知识的巩固学习

自身对java IO知识的掌握比较薄弱,这几天着重学习一下,并尽量做下笔记以加深印象。

1.关于java几种类型的流:

按照流的方向:输入流(inputStream)和输出流(outputStream)。

按照实现功能分:节点流(可以从或向一个特定的地方(节点)读写数据。

如 FileReader)和处理流(是对一个 已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写。如 BufferedReader。处理流的构造方法总是要 带一个其他的流对象做参数。一个流对象经过其他流的多次包装,称为流的链接。)

按照处理数据的单位:字节流和字符流。字节流继承于 InputStream 和 OutputStream,字符流继承于 InputStreamReader 和 OutputStreamWriter。

2. 字节流如何转为字符流(两者的区别)

字节输入流转字符输入流通过InputStreamReader实现,该类的构造函数可以传入 InputStream 对象。

字节输出流转字符输出流通过OutputStreamWriter实现,该类的构造函数可以传入 OutputStream 对象。

3.关于流的序列化与反序列化

如上!

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×