>>分享Java编程技术,对《Java面向对象编程》等书籍提供技术支持 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 19913 个阅读者 刷新本主题
 * 贴子主题:  序列化与反序列化知识点汇总 回复文章 点赞(0)  收藏  
作者:mary    发表时间:2021-06-24 09:03:30     消息  查看  搜索  好友  邮件  复制  引用

什么是序列化、反序列化?

序列化: 将数据结构或对象转换成二进制串(字节)的过程

反序列化:将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程

序列模式

  1.对象持久化概念:将对象转换成字节,存放到硬盘或者是数据库中,

2.网络传输对象概念:客户端将对象转成字节的形式(序列化)、变成二进制的形式发送给服务器端,服务器端接受到字节之后,反序列化成对象(rpc远程通讯)

网络传输对象为什么需要序列化?

因为网络无法直接传输对象,对象只存在于内存中,要想网络传输或存储,必须要先序列化。

序列化实现方式

a、原生序列化方式,类必须实现Serializable接口,但是关键字transient修饰的变量是不被序列化的

b、json序列化(有的地方把fastjson也当做是一种更高级的json序列化)

c、谷歌的ProtoBuf方式序列化

网络传输序列化协议有哪些

  网络传输序列化还需要考虑跨语言问题。

A、xml格式序列化,不能序列化方法,且重量级,能增加带宽

B、Json格式序列化(fastjson有的也会当做一种),使用key-value方式,缺点是不够精简

C、Hessian

D、MessagePack

E、企业内部自定义协议:(谷歌公司的protobuf、Facebook的Thrift协议、Apache Hadoop公司的Avro)

XML、Json、Hession、ProtocolBuf区别

XML:使用.Net自带的XmlSerializer。

Json:使用的是ServiceStack.Text,性能高于Newtonsoft.Json,但是速度最快的应该是fastJSON.net。

Hessian:使用的是HessianCSharp库, 从nuget上下载。

Protocol Buffers:使用的是protobuf-net,从nuget上下载。

MsgPack和Hessian序列化对比

a、结构:hessian为key-value方式,msgpack为有序的数组

b、性能:msgpack更加精简,性能可提高1-3倍

c、扩展性:hessian可随意添加字段,msgpack必须要保证字段顺序,扩展性不如hessian。

d、其他:

hessian会把map/list集合转为hashmap/arraylist,对linkedhashmap等类型会丢失,支持匿名的map/list集合

msgpack会报了集合类的类型,不支持匿名集合类

总结:为了灵活选择hessian,为了性能选择msgpack。

MessagePack编码器与json有哪些区别

  MessagePack去除了json格式的key,所有value按顺序行程数组传输,减少了带宽,且传输更快

结论

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

2、Thrift与Protobuf相比在时空开销方面都有一定的劣势。
3、Protobuf和Avro在两方面表现都非常优越。

选型建议

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

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

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

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

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

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

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

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

9、如果序列化之后需要支持不同的传输层协议,或者需要跨防火墙访问的高性能场景,Protobuf可以优先考虑。
----------------------------
原文链接:https://www.jianshu.com/p/5b8027497d19

程序猿的技术大观园:www.javathinker.net



[这个贴子最后由 flybird 在 2021-06-24 11:13:54 重新编辑]
  Java面向对象编程-->类的生命周期
  JavaWeb开发-->自定义JSP标签(Ⅰ)
  JSP与Hibernate开发-->Java应用分层架构及软件模型
  Java网络编程-->创建非阻塞的HTTP服务器
  精通Spring-->通过Axios访问服务器
  Vue3开发-->CSS过渡和动画
  解决javac编译错误: 编码UTF8/GBK的不可映射字符
  实用类 EncodingDetect,查看一个文件的字符编码
  好消息:孙卫琴老师等直播分享Java分布式架构专题
  内部类的编程练习题
  64匹马,8个赛道,找出跑得最快的4匹马
  Java异常堆栈信息以字符串形式输出
  java万年历简单制作
  NoClassDefFoundError和ClassNotFoundException的区别
  Java设计模式:抽象工厂模式
  java常见的几种调用机制:同步调用,异步调用,回调
  Java入门实用代码:获取所有线程
  Java入门实用代码:线程状态监测
  Java 入门实用代码:数组扩容
  史上最全正则表达式合集(马上收藏)
  Java线程实现龟兔赛跑
  更多...
 IPIP: 已设置保密
楼主      
1页 0条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


中文版权所有: JavaThinker技术网站 Copyright 2016-2026 沪ICP备16029593号-2
荟萃Java程序员智慧的结晶,分享交流Java前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。