序列化
先看下百度百科的介绍
我们可以简单理解为序列化就是将实例转化为二进制数据存储起来的过程,反序列化就是相反的过程
为什么会出现序列化,有什么用?
在实际工作项目中,对象实例化后是在内存中存储的,对象也会被回收,要想永久保存对象数据,就需要序列化了。
如何实现序列化
1.创建Person并实现Serializable接口
import java.io.Serializable;
public class Person implements Serializable {
private String name;
private String bankId;
private static String sex="男";
private transient String password;
private static final long serialVersionUID = -3234214123421341234L;
public Person(String name,String bankId,String password) {
this.name = name;
this.bankId=bankId;
this.password=password;
}
}
2.序列化与反序列化
import java.io.*;
import com.google.gson.Gson;
public class SerialDemo {
//序列化
public static void serialization() throws Exception{
//创建个文件来接受写序列化后的数据
File f = new File("Person.txt");
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(f));
//实例化个对象
Person p = new Person("A","123456789","abcdefg");
//将对象写到文档中
out.writeObject(p);
out.close();
System.out.println("序列化完成");
}
//反序列化
public static void deserialization() throws Exception{
File f = new File("Person.txt");
//读取文件中的数据转为对象
ObjectInputStream in = new ObjectInputStream(new FileInputStream(f));
Object newP = in.readObject();
in.close();
//可以打印下反序列化生成的对象newP
System.out.println(new Gson().toJson(newP));
System.out.println("反序列化完成");
}
public static void main(String[] args) throws Exception {
serialization();
deserialization();
}
}
3.运行结果
需要注意的点
- 被static修饰的属性无法被序列化(这个很好理解静态属性是与类绑定的而不是对象)
- 被transient修饰的属性无法被序列化(有些成员变量不需要被序列化,如Person中的password)
- serialVersionUID是序列化的版本号(基本序列化的对象都会显示的声明一下,以防对象被修改导致无法序列化)
java原生序列化的缺点
- 无法跨语言 Java序列化的字节数组,其他语言无法反序列化
- 序列化后的码流太大
- 序列化性能太低
目前主流序列化框架
json、ProtoBuf