序列化和反序列化的概念:
序列化:把对象转换为字节序列的过程称为对象的序列化。
反序列化:把字节序列恢复为对象的过程称为对象的反序列化。
什么情况下需要序列化
当你想把的内存中的对象状态保存到一个文件中或者数据库中时候;
当你想用套接字在网络上传送对象的时候;
当你想通过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()); } }
原文:https://www.cnblogs.com/gaopengpy/p/11910294.html