先聊聊 Java的序列化,Java官方的序列化和反序列化的实现被太多人吐槽,这得归于Java官方序列化实现的方式。

1、Java序列化的性能经常被吐槽。
2、Java官方的序列化后的数据相对于一些优秀的序列化的工具,还是要大不少,比如probuf,这大大影响存储和传输的效率。
3、Java序列化一定需要实现Serializable接口
4、Java序列化的 serialVersionUID 也是个大坑

另外,序列化和反序列化中还需要考虑:跨语言,新旧对象版本兼容,安全,性能。今天主要来说说,Hessian2是如何来解决这些问题的?

一、跨语言:hessian提供了一整套的byte[]的写入规范,这个规范为其他的语言实现hessian的序列化和反序列化提供了可能。
http://hessian.caucho.com/doc/hessian-serialization.html

目前hessian2已经支持了非常多语言,Java,Node,php,Erlang,c#.......

二、新旧对象版本兼容:hessian2将类的描述信息写入byte[]中,以便于在反序列化时候能正常。但是这样就带来了一个问题:序列化后的内容较大。

三、安全,hessian序列化时,会调用writeReplace方法得到一个新的对象,能将对象中的一些值进行加密后在进行序列化。

四、性能:hessian2的序列化在内容的序列化上做了一些优化,hessian2将需要序列化的多个相同的对象只会写入一次,其他用到该对象的只使用对象的引用,而不重新写入对象的描述信息和值信息。但是hessian2在描述信息上写入的信息来兼容动态化的反序列化支持,所以内容相对于一些描述性的序列化工具(thrift,protobuf)来说,在性能上没有优势。

再回到序列化,相对于 Java来说,hessian的序列化从跨语言,新旧对象的版本兼容,安全以及性能方面都做的好,主要体现在:

一、Java的序列化无法跨语言。
二、新旧对象的版本Java可以通过一个serialVersionUID来处理,这就需要开发者关注序列化的几个语义。
三、Java需要实现一个接口才能进行序列化和反序列化,序列化没有进行加解密的接口。
四、Java序列化后的内容比Hessian更大,这不利于序列化本身的性能和网络传输、以及存储的性能。

当然我们还有更加优秀的一些序列化和反序列化的工具,根据不同的使用场景可以自行选择!

对性能敏感,对开发体验要求不高的内部系统。
  thrift/protobuf

对开发体验敏感,性能有要求的内外部系统。
  hessian2

对序列化后的数据要求有良好的可读性
  jackson/gson/xml

Hessian 序列化和反序列化实现的更多相关文章

  1. Java序列化与Hessian序列化的区别

    Java序列化: Java序列化会把要序列化的对象类的元数据和业务数据全部序列化为字节流,而且是把整个继承关系上的东西全部序列化了.它序列化出来的字节流是对那个对象结构到内容的完全描述,包含所有的信息 ...

  2. Hessian序列化的一个潜在问题

    一. 最近的用rpc框架的时候,当用hessian序列化对象是一个对象继承另外一个对象的时候,当一个属性在子类和有一个相同属性的时候,反序列化后子类属性总是为null. 二. 示例代码: DTO对象 ...

  3. 【Java面试】简单说一下你对序列化和反序列化的理解

    Hi,大家好,我是Mic 一个工作4年的粉丝,投了很多简历 好不容易接到一个互联网公司的面试邀约. 在面试第一轮就被干掉了,原因是对主流互联网技术理解太浅了. 其中就有一个这样的问题:"简单 ...

  4. 面试题:Java序列化与反序列化

    目录 序列化和反序列化的概念 应用场景? 序列化实现的方式 继承Serializable接口,普通序列化 继承Externalizable接口,强制自定义序列化 serialVersionUID的作用 ...

  5. C# 序列化与反序列化几种格式的转换

    这里介绍了几种方式之间的序列化与反序列化之间的转换 首先介绍的如何序列化,将object对象序列化常见的两种方式即string和xml对象; 第一种将object转换为string对象,这种比较简单没 ...

  6. 使用Newtonsoft.Json.dll(JSON.NET)动态解析JSON、.net 的json的序列化与反序列化(一)

    在开发中,我非常喜欢动态语言和匿名对象带来的方便,JSON.NET具有动态序列化和反序列化任意JSON内容的能力,不必将它映射到具体的强类型对象,它可以处理不确定的类型(集合.字典.动态对象和匿名对象 ...

  7. Java 序列化与反序列化

    1.什么是序列化?为什么要序列化? Java 序列化就是指将对象转换为字节序列的过程,而反序列化则是只将字节序列转换成目标对象的过程. 我们都知道,在进行浏览器访问的时候,我们看到的文本.图片.音频. ...

  8. C#中怎样实现序列化和反序列化

    我们想要将数据进行持久化的操作的话,也就是将数据写入到文件中,我们在C#中可以通过IO流来操作,同时也可以通过序列化来操作,本人是比较推荐使用序列化操作的 因为我们如果想要将一个对象持久化到文件中 如 ...

  9. Java序列化与反序列化

    Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java序列化与反序列化?本文围绕这些问题进行了探讨. 1.Java序列化与反序列化 Java序列化是指把Java对象转换为字节序列 ...

随机推荐

  1. Android开发系列之系统源码目录

    相信大家对于Google给出的那副经典Android架构图非常的熟悉,从下往上依次是Linux内核层(主要是负责硬件管理调度),HAL层(主要是硬件抽象层),libs层+Runtime,Framewo ...

  2. hibernate实现多变联合查询

    Hibernate主要支持两种查询方式:HQL查询和Criteria查询.前者应用较为广发,后者也只是调用封装好的接口. 现在有一个问题,就是实现多表连接查询,且查询结果集不与任何一个实体类对应,怎么 ...

  3. VS2012删除选项卡菜单中的"关闭所有文档"

    delete the "close all documents" item of tab menu in vs2012 Tools -> Customize -> Co ...

  4. Linux安装php-7.0.16,完成php和apache的配置

    Linux安装php-7.0.16,完成php和apache的配置     版本:php-7.0.16.tar.gz,libxml2-2.9.2.tar.gz(php需要它的支持,首先安装它) 说明 ...

  5. 织梦DedeCMS自定义表单提交成功后返回当前页面的教程

    织梦的自定义表单制作的留言,报名等功能,提交成功后会自动返回到首页,那么如何让它返回到当前页面呢? 方法如下: 打开plus/diy.php文件 找到 showmsg($bkmsg, $goto); ...

  6. rsync 删除大量小文件

    3 find with delete 复制代码代码如下:  test  time find ./ -type f -delete        find ./ -type f -delete  0.4 ...

  7. [原]Nginx+Lua服务端合并静态文件

    http://homeway.me 0x01.About 源代码已经上传到github:https://github.com/grasses/nginx-lua-static-merger nginx ...

  8. 如何使用EasyNVR+CDN突破萤石云在直播客户端数量上的限制,做到低成本高性价比的直播

    恰逢五一假期,有以为来自内蒙的用户向我电话咨询,大概的场景是这样的: 目前用户使用的是全套的海康IPC和NVR设备: 海康NVR设备通过设置萤石云平台,由萤石云对外提供直播服务: 萤石云对单个摄像机同 ...

  9. 6.2.1-FactoryBeanRegistrySupport(未全)

    FactoryBeanRegistrySupport 的关系图: 添加工厂方式创建类FactoryBean的支持

  10. TCP协议要点和难点全解

    转载自http://www.cnblogs.com/leetieniu2014/p/5771324.html TCP协议要点和难点全解 说明: 1).本文以TCP的发展历程解析容易引起混淆,误会的方方 ...