序列化与反序列化

序列化和反序列化的概念:
序列化:把对象转换为字节序列的过程称为对象的序列化。
反序列化:把字节序列恢复为对象的过程称为对象的反序列化。

什么情况下需要序列化
当你想把的内存中的对象状态保存到一个文件中或者数据库中时候;
当你想用套接字在网络上传送对象的时候;
当你想通过RMI传输对象的时候;

如何实现序列化
实现Serializable接口即可

注意事项
1.在默认的序列化实现中,会包括 非静态域 和 非瞬时域,与域的可见性声明没有关系,可能导致隐私信息泄露。
2.与1相对,静态域和瞬时域不会被序列化。
3.添加 serialVersionUID
private static final long serialVersionUID = 1L;

主流的RPC框架一般采用Hessian协议序列化。

Hessian要实现序列化,前提是被序列化的类得实现Serializable接口。

hessian序列化的效率更高,且序列化的数据更小,在基于RPC的调用方式中性能更好。

序列化代码示例:

添加hessian的依赖:

<dependency>
    <groupId>com.caucho</groupId>
    <artifactId>hessian</artifactId>
    <version>4.0.7</version>
</dependency>

 

实现类:

package com.gaopeng.springboot.serializable;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.Serializable;

import com.caucho.hessian.io.Hessian2Input;
import com.caucho.hessian.io.Hessian2Output;

public class Student implements Serializable {
    private String name;
    public static String hobby = "eat";

    // 1.一旦变量被transient修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问。
    // 2.transient关键字只能修饰变量,而不能修饰方法和类。注意,本地变量是不能被transient关键字修饰的。变量如果是用户自定义类变量,则该类需要实现Serializable接口。
    // 3.一个静态变量不管是否被transient修饰,均不能被序列化。
    transient private String address;

    public String getName() {
        return name;
    }

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

    public static String getHobby() {
        return hobby;
    }

    public static void setHobby(String hobby) {
        Student.hobby = hobby;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public static void main(String[] args) throws IOException {
        Student stu = new Student();
        stu.setAddress("上海市杨浦中心医院");
        stu.setName("张三");

        ByteArrayOutputStream os = new ByteArrayOutputStream();
        Hessian2Output output = new Hessian2Output(os);
        output.writeObject(stu);
        output.close();

        Student.hobby = "drink";

        ByteArrayInputStream bis = new ByteArrayInputStream(os.toByteArray());
        Hessian2Input input = new Hessian2Input(bis);

        Student student = (Student) input.readObject();
        System.out.println(student.getAddress());
        System.out.println(student.getName());
        System.out.println(student.getHobby());
        System.out.println(stu.getHobby());
    }
}

 

posted @ 2019-11-22 10:56  gaopengpy  阅读(188)  评论(0编辑  收藏  举报