Hessian 序列化

Hessian 序列化

Hessian 序列化是一种轻量级的二进制 RPC 序列化方式。

一、定义与特点

  1. 定义:

    • Hessian 是一种用于在不同编程语言之间进行高效对象序列化和远程方法调用的二进制协议。它主要用于在分布式系统中进行数据传输和远程过程调用(RPC)。

  2. 特点:

    • 高效性:Hessian 采用二进制格式进行序列化,相比基于文本的序列化方式(如 JSON、XML),它具有更高的传输效率和更小的数据体积。

    • 跨语言性:支持多种编程语言,如 Java、Python、C++ 等。这使得不同语言编写的应用程序可以方便地进行通信和交互。

    • 简单易用:Hessian 的 API 相对简单,易于使用和集成到各种应用程序中。

二、工作原理

  1. 序列化过程:

    • 当使用 Hessian 进行序列化时,它会将对象转换为二进制格式的字节流。这个过程包括对对象的属性进行遍历和编码,将其转换为可以在网络上传输的二进制数据。

    • 例如,在 Java 中,一个包含多个属性的对象可以通过 Hessian 的序列化机制被转换为二进制字节流,以便在网络上传输到远程服务器。

  2. 反序列化过程:

    • 在接收端,Hessian 会将接收到的二进制字节流进行反序列化,还原为原始的对象。这个过程包括对二进制数据进行解码和解析,重建对象的属性和状态。

    • 例如,当远程服务器接收到序列化的对象字节流后,它可以使用 Hessian 的反序列化机制将其转换为原始的对象,以便进行进一步的处理和操作。

三、在 Dubbo 中的应用

  1. RPC 通信:

    • 在 Dubbo 中,Hessian 序列化被用于在服务提供者和服务消费者之间进行高效的数据传输。当服务消费者调用远程服务时,请求参数会被序列化为 Hessian 格式的二进制数据,并通过网络传输到服务提供者。服务提供者接收到请求后,会对二进制数据进行反序列化,还原为原始的请求参数对象,并进行相应的业务处理。处理结果也会被序列化为 Hessian 格式的二进制数据,并返回给服务消费者。服务消费者接收到响应后,会对二进制数据进行反序列化,得到最终的结果。

  2. 与其他序列化方式的比较:

    • 在 Dubbo 中,除了 Hessian 序列化,还支持其他序列化方式,如 Java 原生序列化、JSON 序列化等。不同的序列化方式具有不同的特点和适用场景。Hessian 序列化在性能和跨语言性方面具有一定的优势,适用于对性能要求较高且需要跨语言通信的场景。而 Java 原生序列化虽然简单易用,但性能相对较低,且只适用于 Java 语言之间的通信。JSON 序列化则具有良好的可读性和通用性,但性能也相对较低。

总之,Hessian 序列化是一种高效的二进制序列化方式,在 Dubbo 等分布式系统中得到了广泛的应用。它可以提高数据传输的效率和系统的性能,同时支持跨语言通信,为分布式系统的开发和部署提供了便利。

四、代码使用

以下是另一个使用 Hessian 序列化的例子。

假设有一个表示商品的类:

 public class Product {private String name;private double price;​public Product(String name, double price) {this.name = name;this.price = price;}​public String getName() {return name;}​public double getPrice() {return price;}}

现在我们来使用 Hessian 进行序列化和反序列化操作:

 import com.caucho.hessian.io.HessianInput;import com.caucho.hessian.io.HessianOutput;​import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;​public class HessianExample2 {public static void main(String[] args) throws Exception {// 创建商品对象Product product = new Product("Laptop", 999.99);​// 序列化ByteArrayOutputStream baos = new ByteArrayOutputStream();HessianOutput hessianOutput = new HessianOutput(baos);hessianOutput.writeObject(product);hessianOutput.close();byte[] serializedData = baos.toByteArray();​// 反序列化ByteArrayInputStream bais = new ByteArrayInputStream(serializedData);HessianInput hessianInput = new HessianInput(bais);Product deserializedProduct = (Product) hessianInput.readObject();hessianInput.close();​// 输出结果System.out.println("原始商品:" + product.getName() + ", " + product.getPrice());System.out.println("反序列化后的商品:" + deserializedProduct.getName() + ", " + deserializedProduct.getPrice());}}

在这个例子中,我们创建了一个Product对象,然后通过 Hessian 的序列化和反序列化操作,验证了数据在传输前后的一致性。

五、JSON和Hessian长相

以下是对 JSON 和 Hessian 序列化后的示例展示:

1、JSON 序列化示例

假设有一个简单的 Java 对象:

 class Person {private String name = "John";private int age = 30;​public String getName() {return name;}​public int getAge() {return age;}}

使用见的 JSON 库(如 Jackson)进行序列化后可能如下所示:

 {"name": "John","age": 30}

2、Hessian 序列化示例

Hessian 序列化后的结果是二进制数据,不太容易以可读的形式展示。但可以想象它以紧凑的二进制格式存储了对象的状态信息。

例如,对于上面的Person对象,经过 Hessian 序列化后是一串二进制字节流,没有像 JSON 那样直观的文本表示。如果尝试以十六进制形式查看一小段可能类似这样(这只是为了示意,实际的 Hessian 序列化结果会复杂得多且不具备这样的可读性):

 0C 6A 6F 68 6E 1E 00 00 00 1E

总之,JSON 序列化结果是人类可读的文本格式,而 Hessian 序列化结果是二进制数据,更高效但不便于直接查看内容。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/56050.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Oracle数据库的乐观锁和悲观锁

Oracle数据库的悲观锁和乐观锁是两种数据锁定机制。 悲观锁(Pessimistic Locking)在数据开始读取的时候就把数据锁定住,其它想插入的数据要等待直到锁的释放。这种锁定数据的方式带来的是性能的降低,因为在多用户并发访问的时候&…

Go语言实现长连接并发框架 - 任务管理器

文章目录 前言接口结构体接口实现项目地址最后 前言 你好,我是醉墨居士,我们上篇博客实现了路由分组的功能,接下来这篇博客我们将要实现任务管理模块 接口 trait/task_mgr.go type TaskMgr interface {RouterGroupStart()StartWorker(tas…

【计网】从零开始学习http协议 ---深入理解cookie和session

我的天空里没有太阳, 总是黑夜, 但并不暗, 因为有东西代替了太阳。 --- 东野圭吾 --- 从零开始学习http协议 1 理解cookie1.1 什么是cookie1.2 验证cookie1.3 cookie的属性 2 理解session2.1 什么是session2.2 验证session 1 理解cooki…

刷题 链表

面试经典150题 - 链表 141. 环形链表 class Solution { public:bool hasCycle(ListNode *head) {ListNode* slow head, *fast head;while (fast ! nullptr && fast->next ! nullptr) {slow slow->next;fast fast->next->next;if (slow fast) {return…

【Linux复习】指令

文章目录 1.>2. cat3.系统命令bash和shell和kernel权限只被认证一次粘滞位引入前提知识场景解释为什么普通用户(无w权限)可以删除文件?为什么普通用户通过sudo设置文件权限为000后仍能删除文件? 结论 粘滞位是干什么的&#xf…

苍穹外卖P19--异常处理

以上传数据库数据重复为例,进行异常处理。 接口文档报错: 重新启动:

使用 Wireshark 抓取类似的 HTTP 请求包

要使用 Wireshark 抓取类似的 HTTP 请求包,可以按照以下步骤进行操作: 安装并启动 Wireshark 如果你还没有安装 Wireshark,可以从Wireshark 官方网站下载并安装它。 安装完成后,启动 Wireshark。选择网络接口 在 Wireshark 主界面…

Linux中perf的使用

perf 是 Linux 系统中的一个强大的性能分析工具,广泛用于内核和用户态程序的性能分析。它可以帮助开发者和系统管理员深入了解程序的 CPU 使用情况、函数调用频率、缓存命中率、硬件事件等,进而优化程序的性能。 下面我将详细介绍如何在 Linux 系统中使…

单例模式和读者写者问题

文章目录 10. 线程安全的单例模式10.1 什么是设计模式10.2 什么是单例模式10.3 单例模式的特点10.4 饿汉方式和懒汉方式10.5 单例模式的线程池 11. STL和智能指针的线程安全 问题11.1 STL中的容器是否是线程安全的?11.2 智能指针是否是线程安全的? 12. 其他常见的各种锁13. 读…

009——二叉树

目录 二叉树的五种基本形态: 1.二叉树可以是空树 2.只有一个根节点的树 3.斜树:只有左子树或右子树的树 4.左右孩子都有的树 二叉树的性质: 1.假设根节点是第一层,在二叉树的第i层上最多有2^(n-1)个结点 2.深度为k的二叉树…

WebGoat JAVA反序列化漏洞源码分析

目录 InsecureDeserializationTask.java 代码分析 反序列化漏洞知识补充 VulnerableTaskHolder类分析 poc 编写 WebGoat 靶场地址:GitHub - WebGoat/WebGoat: WebGoat is a deliberately insecure application 这里就不介绍怎么搭建了,可以参考其他…

Bash 脚本中解析 INI 文件

在 Bash 脚本中解析 INI 文件可能稍显复杂,因为 Bash 本身并未内置专门用于处理此类配置文件的工具。然而,我们可以通过一些文本处理命令(例如 grep、sed、awk)或借助外部工具(如 python 脚本或 inih 库)来…

基于SSM的旅游网站【附源码】

基于SSM的旅游网站(源码L文说明文档) 目录 4 系统设计 4.1 系统概要设计 4.2 系统功能结构设计 4.3 数据库设计 4.3.1 数据库E-R图设计 4.3.2 数据库表结构设计 5 系统实现 5.1 管理员功能介绍 5.1.1 用户管理 5.1.2 …

每天五分钟深度学习pytorch:基于pytorch搭建多项式线性回归模型

本文重点 我们前面学习了基于pytoch搭建一元线性回归模型,本文我们学习使用pytorch搭建多项式的回归模型,在学习这个之前我们需要了解一下什么是多项式回归模型? 多项式回归模型和多变量(多特征)的回归模型是不一样的,多变量就是一个样本有多个特征属性,而多项式就是一…

云原生化 - 工具镜像(完整版)

在微服务和云原生环境中,容器化的目标之一是尽可能保持镜像小型化以提高启动速度和减少安全风险。然而,在实际操作中,有时候需要临时引入一些工具来进行调试、监控或问题排查。Kubernetes提供了临时容器(ephemeral containers)的功能,允许在不改变原始容器镜像的情况下,…

Centos7 搭建logstash

下载并安装公共签名密钥: sudo rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch 创建一个名为 /etc/yum.repos.d/logstash.repo 的文件,并添加以下内容: [logstash-7.x] nameElastic repository for 7.x packages baseu…

【进阶】面向对象之权限修饰符代码块

文章目录 权限修饰符权限修饰符的使用规则 代码块分类局部代码块(了解就行)构造代码块(了解就行)静态代码块(重点) 权限修饰符 权限修饰符的使用规则 成员变量私有方法公开 特例: 如果方法中的代码是抽取其他方法中共性代码,这个方法一般也私有. 代码…

如何“半路出家”转行算法工程师的?

01 关于择业考虑 算法岗是什么? 算法岗,从根本内容上来说,是算法,算力,数据,应用场景的交集。从工作要求的角度来讲,是你的能力能够匹配大厂需要的工作要求。从个人角度来说,是你…

Gitea 忘记密码解决方案

一、在 Windows 上处理 Gitea 密码问题 1. 打开命令提示符: 以管理员身份运行命令提示符 2. 导航到 Gitea 安装目录: 假设你在 C:\gitea 下安装了 Gitea,使用以下命令导航到 Gitea 目录: cd C:\gitea 3. 重置密码&#xff1…

网易博客旧文----bacnet学习系列之三----读取属性程序的分析

bacnet学习系列之三----读取属性程序的分析 2014-01-21 16:29:42| 分类: BACnet | 标签: |举报 |字号大中小 订阅 先上一张自己画的流程图 bacnet学习系列之三----读取属性程序的分析 - xzhoumin - MMZHOU的博客 程序一开始就是分析命令行,…