序列化
- 什么是序列化
- 就是把java对象储存在某一地方(硬盘,网络),也就是将对象的内容
流化
- 两大类
- 序列化
- 将数据分解成字节流,一边存储在文件中或在网络上传输
- 反序列化
- 打开字节流并重构对象,对象序列化不仅要将基本数据类型转换成字节表示,有时还要恢复数据,
- 常用的序列化
- java中自带的序列化技术
- IOException**
- Serializable接口,则所有的序列化将会自动进行
- Externalizable
- 则没有任何东西可以自动序列化,需要在writeExternal方法中进行手工指定所要序列化的变量
json
定义
是一种轻量级的数据交换格式,采用与编程语言无关的文本格式
- 优缺点
- 优点
- 数据格式比较简单,易于读写
- 序列化后数据较小,可扩展性好,兼容性好
- 缺点
- 数据的描述性不乐观
Fastjson
定义
FastJson是一个java语言编写的高性能功能完善的JSON库
- 优缺点
- 优点
- 接口简单易用
- 目前java语言中最快的json库
- 缺点
- 过于注重快,而偏离了“标准”及功能性
- 代码质量不高,文档不全
Protobuf
定义
protobuf是可以进行跨语言的序列化机制
- 优缺点
- 优点
- 性能强
- 结构化数据存储格式(XML JSON等)
- 缺点
- 需要依赖于工具生成代码
- 如何进行序列化
- 让类实现Serializable接口
- 该接口是一个标志性的接口,标注该类可被序列
- 然后
使用输出流来构造一个对象输出流并通过writeObject(Object)方法
就可以将实现对象写出 - 如果需要反序列化,则可以用一个输入流建立对象输入流,然后通过readObject方法从流中读取对象
- 代码
- 序列化User到本地
@Test public void Test01() throws IOException { //获取文件的输出流inputStream //将这个对象输出 User user1 = new User(1,"PopDemo","1234567"); User user2 = new User(2,"yangfan","1234567"); User user3 = new User(3,"iu","1234567"); /** * 与这个文件的输出流进行绑定操作 * 我们利用这个对象的输出流,然后进行写一个操作 * 就可以实现对象的序列化的过程 * 建立管道 * 进行输出实体 */ ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("F:/pop.txt")); //讲类输出到管道内 oos.writeObject(user1); oos.writeObject(user2); oos.writeObject(user3); oos.flush(); oos.close(); System.out.println("数据已保存到本地,感谢您的使用"); } <!--0-->
- transient 和 static 为什么不会被序列化的原因
- transient static不会被序列化(IOException)
- 序列化保存的是对象的状态,静态变量数以类的状态,因此序列化并不保存静态变量。
这里的不能序列化的意思,是序列化信息中不包含这个静态成员域 - 但是还有一种情况会被序列化
- One
- 当我们实现Externalizable接口,则没有任何东西可以自动序列化,需要在writeExternal方法中进行手工指定所要序列化的变量,这与是否被transient修饰无关