Java 序列化
Posted JccVirtual
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 序列化相关的知识,希望对你有一定的参考价值。
1、个人理解
- Java对象序列化是指把一个对象表示为字节序列,该字节序列会包括该对象类型、对象的数据、数据类型等信息;
- 序列化对象可以被写入到文件中;
- 也可以从文件中读取出来再进行反序列化得到对象实例。
2、书面解释
- 关于序列化,常又称为持久化,将其写入磁盘中。
- 进而对于编码规则来说:任一 一个实体类必须要去实现 Serializable 接口,方便以后将该类持久化,或者将其用于转为字节数组,用于网络传输。
3、transient 关键字
对于一个实体对象,不想将所有的属性都进行序列化,有专门的关键字 transient:
private transient String name;
当对该类序列化时,会自动忽略被 transient 修饰的属性
当然该对象反序列话的时候也就不存在这个name属性值了
4、案例
要被序列化的类
public class Employee implements java.io.Serializable { public String name; public String address; public transient int SSN;//这个值不会被序列化传过去 public int number; public void mailCheck() { System.out.println("Mailing a check to " + name + " " + address); } }
序列化对象
注意 ObjectOutputStream 类的 writeObject(Object obj ) 方法,这个方法可以序列化一个对象
import java.io.*; public class SerializeDemo { public static void main(String [] args) { Employee e = new Employee(); e.name = "Reyan Ali"; e.address = "Phokka Kuan, Ambehta Peer"; e.SSN = 11122333; e.number = 101; try { FileOutputStream fileOut = new FileOutputStream("/tmp/employee.ser"); ObjectOutputStream out = new ObjectOutputStream(fileOut); out.writeObject(e); out.close(); fileOut.close(); System.out.printf("Serialized data is saved in /tmp/employee.ser"); }catch(IOException i) { i.printStackTrace(); } } }
反序列化对象
注意 ObjectInputStream 的 readObject() 方法,可以反序列化对象
import java.io.*; public class DeserializeDemo { public static void main(String [] args) { Employee e = null; try { FileInputStream fileIn = new FileInputStream("/tmp/employee.ser"); ObjectInputStream in = new ObjectInputStream(fileIn); e = (Employee) in.readObject(); in.close(); fileIn.close(); }catch(IOException i) { i.printStackTrace(); return; }catch(ClassNotFoundException c) { System.out.println("Employee class not found"); c.printStackTrace(); return; } System.out.println("Deserialized Employee..."); System.out.println("Name: " + e.name); System.out.println("Address: " + e.address); System.out.println("SSN: " + e.SSN); System.out.println("Number: " + e.number); /** *Deserialized Employee... Name: Reyan Ali Address:Phokka Kuan, Ambehta Peer SSN: 0 Number:101 */ } }
5、为什么要序列化
序列化就是把一个原本存储在堆Heap中的存储得略复杂的信息 序列化成一个.ser文件,方便存储和传输;
为了保存对象在内存中的状态(对象类型、数据类型、数据值这些),并且可以把保存的对象读出来;
参考链接:
https://www.cnblogs.com/sunhaoyu/p/4581282.html
6、什么时候要使用序列化
- 当你想把的内存中的对象保存到一个文件中或者数据库中时候;
- 当你想用套接字在网络上传送对象的时候;
- 当你想通过RMI传输对象的时候;
以上是关于Java 序列化的主要内容,如果未能解决你的问题,请参考以下文章