java面试题网

普通会员

108

帖子

11

回复

136

积分

楼主
发表于 2018-06-01 17:33:03 | 查看: 654| 回复: 0

1、XML


优点


人机可读性好


可指定元素或特性的名称


缺点


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


类必须有一个将由 XmlSerializer 序列化的默认构造函数。


只能序列化公共属性和字段


不能序列化方法


文件庞大,文件格式复杂,传输占带宽


使用场景


当做配置文件存储数据


实时数据转换



2、JSON


优点


前后兼容性高


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


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


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


缺点


数据的描述性比XML差


不适合性能要求为ms级别的情况


额外空间开销比较大


适用场景(可替代XML)


跨防火墙访问


可调式性要求高的情况


基于Web browser的Ajax请求


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



3、Thrift


优点


序列化后的体积小, 速度快


支持多种语言和丰富的数据类型


对于数据字段的增删具有较强的兼容性


支持二进制压缩编码


缺点


使用者较少


跨防火墙访问时,不安全


不具有可读性,调试代码时相对困难


不能与其他传输层协议共同使用(例如HTTP)


无法支持向持久层直接读写数据,即不适合做数据持久化序列化协议


适用场景


分布式系统的RPC解决方案



4、Protobuf


优点


序列化后码流小,性能高


结构化数据存储格式(XML JSON等)


通过标识字段的顺序,可以实现协议的前向兼容


结构化的文档更容易管理和维护


缺点


需要依赖于工具生成代码


支持的语言相对较少,官方只支持Java 、C++ 、Python


适用场景


对性能要求高的RPC调用


具有良好的跨防火墙的访问属性


适合应用层对象的持久化



5、其它


protostuff 基于protobuf协议,但不需要配置proto文件,直接导包即


Jboss marshaling 可以直接序列化java类, 无须实java.io.Serializable接口


Message pack 一个高效的二进制序列化格式


Hessian 采用二进制协议的轻量级remoting onhttp工具


kryo 基于protobuf协议,只支持java语言,需要注册(Registration),然后序列化(Output),反序列化(Input)



6、性能对比


XML序列化(Xstream)无论在性能和简洁性上比较差。


Thrift与Protobuf相比在时空开销方面都有一定的劣势。


Protobuf和Avro在两方面表现都非常优越。



7、选型建议


不同的场景适用的序列化协议:


对于公司间的系统调用,如果性能要求在100ms以上的服务,基于XML的SOAP协议是一个值得考虑的方案。


基于Web browser的Ajax,以及Mobile app与服务端之间的通讯,JSON协议是首选。对于性能要求不太高,或者以动态类型语言为主,或者传输数据载荷很小的的运用场景,JSON也是非常不错的选择。


对于调试环境比较恶劣的场景,采用JSON或XML能够极大的提高调试效率,降低系统开发成本。


当对性能和简洁性有极高要求的场景,Protobuf,Thrift,Avro之间具有一定的竞争关系。


对于T级别的数据的持久化应用场景,Protobuf和Avro是首要选择。如果持久化后的数据存储在Hadoop子项目里,Avro会是更好的选择。


由于Avro的设计理念偏向于动态类型语言,对于动态语言为主的应用场景,Avro是更好的选择。


对于持久层非Hadoop项目,以静态类型语言为主的应用场景,Protobuf会更符合静态类型语言工程师的开发习惯。


如果需要提供一个完整的RPC解决方案,Thrift是一个好的选择。


如果序列化之后需要支持不同的传输层协议,或者需要跨防火墙访问的高性能场景,Protobuf可以优先考虑。



您的帖子在2018-06-01 17:33:40被java面试题网编辑
您需要登录后才可以回帖 登录 | 立即注册

java面试题网无聊看看网与java建站系统提供技术支持V2.1 网站地图 © 2016-2018