Java并发编程学习-日记9、JSON 与 Protobuf

1、JSON:

  • Jackson开源库的优点是:所依赖的jar包较少、简单易用、性能也还不错,另外Jackson社区相对比较活跃。
  • Jackson开源库的缺点是:对于复杂POJO类型、复杂的集合Map、List的转换结果,不是标准的JSON格式,或者会出现一些问题。
  • Gson可以完成复杂类型的POJO和JSON字符串的相互转换,转换的能力非常强。
  • 从性能上说,FastJson库采用独创的算法,将JSON转成POJO的速度提升到极致,超过其他JSON开源库。

在POJO序列化成JSON字符串的应用场景,使用Google的Gson库;在JSON字符串反序列化成POJO的应用场景,使用阿里的FastJson库。

2、Protobuf是Google提出的一种数据交换的格式,是一套类似JSON或者XML的数据传输格式和规范,用于不同应用或进程之间进行通信。

Protobuf的编码过程:使用预先定义的Message数据结构将实际的传输数据进行打包,然后编码成二进制的码流进行传输或者存储。

Protobuf的解码过程:将二进制码流解码成Protobuf自己定义的Message结构的POJO实例。Protobuf既独立于语言,又独立于平台。

Protobuf数据包是一种二进制的格式,相对于文本格式的数据交换(JSON、XML)来说,速度要快很多。由于Protobuf优异的性能,使得它更加适用于分布式应用场景下的数据通信或者异构环境下的数据交换。Protobuf传输协议是最高性能的传输协议之一。微信的消息传输就采用了Protobuf协议。

Protobuf使用proto文件来预先定义的消息格式。数据包是按照proto文件所定义的消息格式完成二进制码流的编码和解码。proto文件,简单地说,就是一个消息的协议文件,这个协议文件的后缀文件名为“.proto”。

在Netty中,内置了一组ProtoBuf编/解码器——ProtobufDecoder解码器和ProtobufEncoder编码器,它们负责Protobuf POJO和二进制字节之间的编码和解码。Netty还自带了一组配套的Protobuf半包处理器:可变长度ProtobufVarint32FrameDecoder解码器、ProtobufVarint32LengthFieldPrepender编码器。为二进制ByteBuf加上varint32格式的可变长度,解决了Protobuf传输过程中的粘包/半包问题。

解析复杂的Head-Content协议就需要自定义Protobuf编/解码器,需要开发者自己去解决半包问题,包括以下两个方面:

(1)继承netty提供的MessageToByteEncoder编码器,完成Head-Content协议的复杂数据包的编码,将Protobuf POJO编码成Head-Content协议的二进制ByteBuf数据包。

(2)继承netty提供的ByteToMessageDecoder解码器,完成Head-Content协议的复杂数据包的解码,将二进制ByteBuf数据包最终解码出Protobuf POJO实例。

Protobuf消息格式,大致有以下几个可供参考的原则:

  • 原则一:消息类型使用enum定义。
  • 原则二:使用一个Protobufmessage结构定义一类消息。
  • 原则三:建议给应答消息加上成功标记和应答序号。如果一个请求有多个响应,则发送端可以设计为:每一个响应消息可以包含一个应答的序号,最后一个响应消息包含一个结束标记。接收端在处理的时候,根据应答序号和结束标记,可以合并所有的响应消息。
  • 原则四:编解码从顶层消息开始。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值