序列化

序列化关注点

实现一个序列化会关注以下这些方面的性能:

  1. 无关性,是否具有平台无关,语言无关的特性
  2. 通用性,能否序列化所有可用字符,还是其中的一个子集
  3. 压缩性,空间占用是否小?序列化时间是否快速?
  4. 可读性,是否易于直接理解,如果不能直接理解的话是否有文档
  5. 扩展性,是否能够在增加序列化字段时表现出较好的性能
  6. 安全性,这种序列化方式是否能够基于http/https的安全连接

序列化组件

  1. IDL(Interface description language)文件:参与通讯的各方需要对通讯的内容需要做相关的约定(Specifications)。为了建立一个与语言和平台无关的约定,这个约定需要采用与具体开发语言、平台无关的语言来进行描述。这种语言被称为接口描述语言(IDL),采用IDL撰写的协议约定称之为IDL文件。
  2. IDL Compiler:IDL文件中约定的内容为了在各语言和平台可见,需要有一个编译器,将IDL文件转换成各语言对应的动态库。
  3. Stub/Skeleton Lib:负责序列化和反序列化的工作代码。Stub是一段部署在分布式系统客户端的代码,一方面接收应用层的参数,并对其序列化后通过底层协议栈发送到服务端,另一方面接收服务端序列化后的结果数据,反序列化后交给客户端应用层;Skeleton部署在服务端,其功能与Stub相反,从传输层接收序列化参数,反序列化后交给服务端应用层,并将应用层的执行结果序列化后最终传送给客户端Stub。
  4. Client/Server:指的是应用层程序代码,他们面对的是IDL所生存的特定语言的class或struct。 底层协议栈和互联网:序列化之后的数据通过底层的传输层、网络层、链路层以及物理层协议转换成数字信号在互联网中传递。

JAVA序列化

实现Serializable接口

serializable接口是一个声明接口,标记此javabean可以进行序列化

自定义序列化

可以通过自己创建类中的一些固定方法来让序列化按照自己的逻辑进行:

private void writeObject(ObjectOutputStream out)
private void readObject(ObjectInputStream in)
private void readObjectNoData()
//一定是private方法,反射的时候会获取private类型的方法

实现Externalizable接口

Externalizable接口继承自Serializable接口,但他们的序列化机制是完全不同的,使用Serializable在反序列化是不会调用任何的序列化对象构造器,而使用Externalizable是会调用一个无参构造方法的。因为使用Externalizable序列化时,在进行反序列化的时候,会重新实例化一个对象,然后再将被反序列化的对象的状态全部复制到这个新的实例化对象当中去。

serialVersionUID

当我们一个实体类中没有显示的定义一个名为“serialVersionUID”、类型为long的变量时,Java序列化机制会根据编译时的class自动生成一个serialVersionUID作为序列化版本比较,这种情况下,只有同一次编译生成的class才会生成相同的serialVersionUID。例如,当我们编写一个类时,随着时间的推移,我们因为需求改动,需要在本地类中添加其他的字段,这个时候再反序列化时便会出现serialVersionUID不一致,导致反序列化失败。那么如何解决呢?便是在本地类中添加一个“serialVersionUID”变量,值保持不变,便可以进行序列化和反序列化。

transient关键字

当某个字段被声明为transient后,默认序列化机制就会忽略该字段.

transient private int age = 28; 

static关键字

static关键字修饰的是类,在方法区中,序列化的时候到堆上找数据,找不到static修饰的变量,自然也不会对其进行序列化。

XML序列化

XML(Extensible Markup Language)是一种常用的序列化和反序列化协议, 它历史悠久,从1998年的1.0版本被广泛使用至今。

优点

人机可读性好

可指定元素或特性的名称

缺点

序列化数据只包含数据本身以及类的结构,不包括类型标识和程序集信息。

只能序列化公共属性和字段,不能序列化方法

文件庞大,文件格式复杂

使用场景

当做配置文件存储数据

JSON

JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式。它基于 ECMAScript (w3c制定的js规范)的一个子集, JSON采用与编程语言无关的文本格式,简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。

优点

前后兼容性高

数据格式比较简单,易于读写

序列化后数据较小,可扩展性好,兼容性好

与XML相比,其协议比较简单,解析速度比较快

缺点

数据的描述性比XML差,额外空间开销比较大

适用场景

基于Web browser的Ajax请求

传输数据量相对小,实时性要求相对低(例如秒级别)的服务

Protobuf

Protobuf具备了优秀的序列化协议的所需的众多典型特征:

  1. 标准的IDL和IDL编译器,这使得其对工程师非常友好。
  2. 序列化数据非常简洁,紧凑,与XML相比,其序列化之后的数据量约为1/3到1/10。
  3. 解析速度非常快,比对应的XML快约20-100倍。
  4. 提供了非常友好的动态库,使用非常简介,反序列化只需要一行代码。

Protobuf是一个纯粹的展示层协议,可以和各种传输层协议一起使用;Protobuf的文档也非常完善。 但是由于Protobuf产生于Google,所以目前其仅仅支持Java、C++、Python三种语言。另外Protobuf支持的数据类型相对较少,不支持常量类型。由于其设计的理念是纯粹的展现层协议(Presentation Layer),目前并没有一个专门支持Protobuf的RPC框架。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值