JAVA原生序列化与反序列化
序列化与反序列化:
JAVA序列化是指把java对象转换为字节序列的过程,而java反序列化是指把字节序列恢复为java对象的过程。
序列化分为两大部分:序列化和反序列化。序列化是这个过程的第一个部分,将数据分解成字节流,以便储存在文件中或在网络上传输。反序列化就是打开字节流并重构对象。对象序列化不仅要将基本数据类型转换成字节表示,有时还要恢复数据。恢复数据有恢复数据的对象实例。
为什么要序列化与反序列化:
我们知道,当两个进程进行远程通信时,可以相互发送各种类型的数据,包括文本、图片、音频、视频等,而这些数据都会以二进制序列的形式在网络上传送。当两个java进程进行通信时,实现进程间的对象传送需要java序列化与反序列化。一方面,发送方需要把这个java对象转换为字节序列,然后在网络上传送;另一方面,接收方需要从字节序列中恢复出java对象。
通过序列化可以把数据永久地保存在硬盘上,利用序列化还能实现远程通信。
几种常见的序列化和反序列化协议:
XML&SOAP:XML是一种常用的序列化和反序列化协议,具有跨机器,跨语言的优点,SOAP(Simple Object Access Protocol)是一种被广泛应用的,基于XML为序列化和反序列化协议的结构化消息传递协议
JSON(Javascript Object Notation)
Protobuf
序列化的实现:
只有实现了Serializeble或者Externalizable接口的类的对象才能被序列化为字节序列。(不是则会抛出异常)
Person.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| import java.io.Serializable;
public class Person implements Serializable { private String name; private int age;
public Person(){
} public Person(String name, int age){ this.name = name; this.age = age; } @Override public String toString(){ return "Person{"+ "name='" + name + '\''+ ", age=" + age + '}'; } }
|
SerializeTest.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| import java.io.FileOutputStream; import java.io.ObjectOutputStream;
public class serializeTest{ public static void serialize(Object obj) throws Exception{ ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("ser.bin")); oos.writeObject(obj); } public static void main(String[] args) throws Exception{ Person person = new Person("aa",22); System.out.println(person); serialize(person); } }
|
UnserializeTest.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| import java.io.FileInputStream; import java.io.ObjectInputStream; import java.io.IOException;
public class UnserializeTest { public static Object unserialize(String fileName) throws IOException,ClassNotFoundException { ObjectInputStream ois = new ObjectInputStream(new FileInputStream(fileName)); Object obj = ois.readObject(); return obj; } public static void main(String[] args) throws Exception { Person person = (Person)unserialize("ser.bin"); System.out.println(person); } }
|