一、Hessian序列化的前提

Hessian要实现序列化,前提是被序列化的类得实现Serializable接口。

二、Hessian序列化的实现

1.首先需要jar

2.代码实现

public class Student implements Serializable {

private String name;

public static String hobby = "eat";

transient private String address;

}

写个测试类:

Student stu = new Student();

stu.setAddress("屋子科");

stu.setName("ymz");

ByteArrayOutputStream os = new ByteArrayOutputStream();

Hessian2Output output = new Hessian2Output(os);

output.writeObject(stu);

output.close();

Student.hobby = "drink";

ByteArrayInputStream bis = new ByteArrayInputStream(os.toByteArray());

Hessian2Input input = new Hessian2Input(bis);

Student student = (Student) input.readObject();

System.out.println(student.getAddress());

System.out.println(student.getName());

System.out.println(stu.getHobby());

输出结果为:

null

ymz

drink

读出来的静态属性的值是改变后的值,说明静态变量不参与序列化;transient修饰的属性的值为null,说明被transient关键字修饰的属性依然不参与序列化。

从结果可以得出以下结论:

静态属性不能被序列化;

transient关键字修饰的属性不能被序列化;

3.一个值得关注的坑

Stusdent类集成Teacher类,Teacher类中有跟Stusdent类型相同且属性名相同的字段name,接下来看代码:

public class Student extends Teacher implements Serializable {

private String name;

public static String hobby = "eat";

transient private String address;

}

public class Teacher {

private String name;

}

测试类:

Student stu = new Student();

stu.setAddress("屋子科");

stu.setName("ymz");

ByteArrayOutputStream os = new ByteArrayOutputStream();

Hessian2Output output = new Hessian2Output(os);

output.writeObject(stu);

output.close();

ByteArrayInputStream bis = new ByteArrayInputStream(os.toByteArray());

Hessian2Input input = new Hessian2Input(bis);

Student student = (Student) input.readObject();

System.out.println(student.getName());

输出结果为:

null

理论上输出的结果应该为“ymz”,但现在为null,原因如下:

hessian序列化的时候会取出对象的所有自定义属性,相同类型的属性是子类在前父类在后的顺序;

hessian在反序列化的时候,是将对象所有属性取出来,存放在一个map中 key = 属性名 value是反序列类,相同名字的会以子类为准进行反序列化;

相同名字的属性 在反序列化的是时候,由于子类在父类前面,子类的属性总是会被父类的覆盖,由于java多态属性,在上述例子中父类 student.name = null。

得出结论:

使用hessian序列化时,一定要注意子类和父类不能有同名字段

跟Serializable序列化的比较:

hessian序列化的效率更高,且序列化的数据更小,在基于RPC的调用方式中性能更好。

hessian java_java序列化之Hessian相关推荐

  1. Hessian学习总结(一)——Hessian入门

    一.远程通讯协议的基本原理 网络通信需要做的就是将流从一台计算机传输到另外一台计算机,基于传输协议和网络 IO 来实现,其中传输协议比较出名的有 http . tcp . udp 等等, http . ...

  2. java hessian 协议_dubbo的Hessian协议的使用

    因为在项目中需要在dubbo的消费者和生产者之间传递文件,目前使用的是字节数组作为参数的形式,但是看到官网提供的文档说Hessian协议适合传递文件,所以自己做了一个例子,测试后是可以正常运行的.下面 ...

  3. 简单了解各种序列化技术-Hessian序列化框架

    Hessian是一个支持跨语言传输的二进制序列化协议,相对于Java默认的序列化机制来说,Hessian具有更好的性能和易用性,而且支持多种不同的语言 实际上Dubbo采用的就是Hessian序列化来 ...

  4. java hessian rmi_RMI,socket,rpc,hessian,http比较

    SOCKET使用时可以指定协议TCP,UDP等: RIM使用JRMP协议,JRMP又是基于TCP/IP: RPC底层使用SOCKET接口,定义了一套远程调用方法: HTTP是建立在TCP上,不是使用S ...

  5. hessian java php_探讨Hessian在PHP中的使用分析

    /** * 类名        : HessianApi * * 参考资料    : * 1.http://hessian.caucho.com/ ( Hessian主页 ) * 2.http://h ...

  6. 魔域java_java序列化

    Java序列化Serialize 序列化与反序列化 序列化:把对象写入到流中 反序列化:把对象从流中读取出来 什么情况下序列化 对象需要通过网络进行传输 需要持久化对象到磁盘 需要持久化对象到数据库( ...

  7. 几种Java常用序列化框架的选型与对比

    简介: 序列化与反序列化是我们日常数据持久化和网络传输中经常使用的技术,但是目前各种序列化框架让人眼花缭乱,不清楚什么场景到底采用哪种序列化框架.本文会将业界开源的序列化框架进行对比测试,分别从通用性 ...

  8. 面试现场:小伙伴美团一面的分享和分析「含解答」

    作者:小傅哥 博客:https://bugstack.cn ❝ 沉淀.分享.成长,让自己和他人都能有所收获!???? ❞ 目录 一.前言 二.面试现场 三.总结 四.系列推荐 一.前言 最近给大家整理 ...

  9. java用正则表达式 编写简单词法分析器_500+ 精选 Java 面试题大放送

    凡事预则立不预则废,无论你是近期打算跳槽,还是过完年准备跳槽,我想此刻开始准备面试,无疑是最明智的选择.信息过载的今天,想要找一份靠谱的高频面试题和权威的答案非常不容易,本文为你汇总了大量的干货面试资 ...

最新文章

  1. 字节跳动推荐平台技术公开,项亮:底层架构有时比上层算法更重要
  2. Python IDLE无法显示行号、Python IDLE shell里运行py文件
  3. springmvc传递数组参数
  4. Django Abstract Models使用下划线设置related_name
  5. 内网穿透工具ngrok的使用
  6. jQuery EasyUI使用教程之创建标签页
  7. vue的diff 算法
  8. shell 用环境变量的值修改properties文件
  9. 组件库实战 | 用vue3+ts实现全局Header和列表数据渲染ColumnList
  10. 圆形进度条以及百分率指示器 Scroller类的练习
  11. 房地产税迟早要来,而且会带来房价小涨。
  12. 交叉编译和使用HTOP
  13. JavaScript面向对象详解
  14. 【互联网及其应用】第7章计算机网络安全及管理技术
  15. 惠普硬盘测试工具_短DST未通过,详细教您惠普笔记本如何检测硬盘
  16. Java程序的基本结构
  17. 第二篇 再读Spring 之 BeanDefinition解析
  18. 油门刹车标定表的制作
  19. 计划行为理论和技术接受模型整合模型图形_音乐与语言加工的二元模型(dual modal)...
  20. 鸿蒙系统陈教授,这位默默无闻的英雄教授,才是鸿蒙之父。

热门文章

  1. 【VUE 项目中使用luckysheet(在线表格)】
  2. R语言使用quantile函数计算评分值的分位数(20%、40%、60%、80%)、使用逻辑操作符将对应的分位区间(quantile)编码为分类值生成新的字段、strsplit函数将学生的名和姓拆分
  3. Linux 中 Swap 分区的概念和使用
  4. 电视支架什么牌好?电视支架品牌推荐
  5. 谷歌跟oracle_Oracle诉Google,我的甜心领主
  6. 资本寒冬来临,美图的增长引擎如何发动?
  7. 深度学习入门笔记之GoogLeNet网络
  8. lululemon系列一:耿直boy初出茅庐
  9. linux 下chrome 73 自动打开flash 设置
  10. 电竞游戏蓝牙耳机哪个牌子好?电竞游戏蓝牙耳机排行榜