序列化和反序列化

什么是序列化和反序列化 序列化是指将数据结构或者对象转换成二进制串的过程;反序列化则是将二进制串转换成数据结构和对象。
序列化和反序列化主要用网络通讯过程,对应TCP/IP协议的应用层、OSI七层模型的表现层,将应用层的数据转换成二进制进行传输。
Java序列化

  • 实现方式
    对于要序列化的对象,实现Serializable或者Externalizable接口。通过ObjectInputStream 和 ObjectOutputStream进行序列化和反序列化。
public class Person implements Serializable { private String name; //加入关键字,不会被序列化 private transient int age; public String getName() { return name; }public void setName(String name) { this.name = name; }public int getAge() { return age; }public void setAge(int age) { this.age = age; }private void writeObject(ObjectOutputStream out) throws IOException { out.writeObject(name); out.writeInt(age); } private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { this.name=(String) in.readObject(); this.age = in.readInt(); } } public static void main(String[] args) throws IOException, ClassNotFoundException { Person person = new Person(); person.setName("Jay"); person.setAge(27); OutputStream outputStream = new FileOutputStream("person.txt"); ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream); objectOutputStream.writeObject(person); outputStream.close(); objectOutputStream.close(); InputStream inputStream = new FileInputStream("person.txt"); ObjectInputStream objectInputStream = new ObjectInputStream(inputStream); Person b = (Person) objectInputStream.readObject(); System.out.println(b.getAge()); System.out.println(b.getName());

  • 需要注意的点
    1、静态变量不会被序列化
    2、Transient关键字修饰的变量不会序列化
    3、若父类已实现Serializable接口,则子类可以不用再实现;若父类没有实现Serializable接口,子类实现了Serializable,则父类的属性不会被序列化。
    4、允许自定义序列化和反序列化过程,用于实现脱敏和加密;也可以通过自定义方法绕过Transient关键字的约束,如上例所示。
序列化算法指标
  • 可读性
  • 通用性:是否支持跨语言,跨平台
  • 性能:空间开销,时间开销
常见的序列化技术 1、Java序列化,优点:java语言本身提供,使用比较简单和方便。缺点:不支持跨语言处理、性能相对不是很好,序列化后产生的数据相对较大。
2、XML&SOAP
XML是一种常用的序列化和反序列化协议,具有跨机器,跨语言等优点。标准的XML描述格式有两种:DTD(Document Type Definition)和XSD(XML Schema Definition)。
SOAP(Simple Object Access protocol) 是一种被广泛应用的,基于XML为序列化和反序列化协议的结构化消息传递协议。SOAP在互联网影响如此大,以至于我们给基于SOAP的解决方案一个特定的名称--Web service。SOAP协议的主要接口描述语言(IDL)是WSDL(Web Service Description Language)。而WSDL的描述文件是XSD。

3、JSON
JSON起源于弱类型语言Javascript, 它的产生来自于一种称之为"Associative array"的概念,其本质是就是采用"Attribute-value"的方式来描述对象。与XML相比,其协议比较简单,解析速度比较快。
  • Jackson
  • Gson
  • FastJson
4、Thrift
Thrift是Facebook开源提供的一个高性能,轻量级RPC服务框架,其产生正是为了满足当前大数据量、分布式、跨语言、跨平台数据通讯的需求。 但是,Thrift并不仅仅是序列化协议,而是一个RPC框架。相对于JSON和XML而言,Thrift在空间开销和解析性能上有了比较大的提升。但是由于Thrift的序列化被嵌入到Thrift框架里面,Thrift框架本身并没有透出序列化和反序列化接口,这导致其很难和其他传输层协议共同使用。
【序列化和反序列化】5、Protobuf
Protobuf具备了优秀的序列化协议的所需的众多典型特征。序列化数据非常简洁,紧凑,与XML相比,其序列化之后的数据量约为1/3到1/10,解析速度非常快,比对应的XML快约20-100倍。但需要专门的Protobuf编译器编译。

    推荐阅读