Java序列化和hessian序列化的区别

如题所述

在远程调用中,需要把参数和返回值通过网络传输,这个使用就要用到序列化将对象转变成字节流,从一端到另一端之后再反序列化回来变成对象。
既然前面有一篇提到了hessian,这里就简单讲讲Java序列化和hessian序列化的区别。
首先,hessian序列化比Java序列化高效很多,而且生成的字节流也要短很多。但相对来说没有Java序列化可靠,而且也不如Java序列化支持的全面。而之所以会出现这样的区别,则要从它们的实现方式来看。
先说Java序列化,具体工作原理就不说了,Java序列化会把要序列化的对象类的元数据和业务数据全部序列化从字节流,而且是把整个继承关系上的东西全部序列化了。它序列化出来的字节流是对那个对象结构到内容的完全描述,包含所有的信息,因此效率较低而且字节流比较大。但是由于确实是序列化了所有内容,所以可以说什么都可以传输,因此也更可用和可靠。
而hessian序列化,它的实现机制是着重于数据,附带简单的类型信息的方法。就像Integer a = 1,hessian会序列化成I 1这样的流,I表示int or Integer,1就是数据内容。而对于复杂对象,通过Java的反射机制,hessian把对象所有的属性当成一个Map来序列化,产生类似M className propertyName1 I 1 propertyName S stringValue(大概如此,确切的忘了)这样的流,包含了基本的类型描述和数据内容。而在序列化过程中,如果一个对象之前出现过,hessian会直接插入一个R index这样的块来表示一个引用位置,从而省去再次序列化和反序列化的时间。这样做的代价就是hessian需要对不同的类型进行不同的处理(因此hessian直接偷懒不支持short),而且遇到某些特殊对象还要做特殊的处理(比如StackTraceElement)。而且同时因为并没有深入到实现内部去进行序列化,所以在某些场合会发生一定的不一致,比如通过Collections.synchronizedMap得到的map。

补充:1.原生的Serializable对象只序列化属性,不序列化方法,且不序列化静态变量
2.尽量自定义UID
3.处理对象为ObjectInputStream/ObjectOutputStream,尽量自定义序列方式,自定义writeObject和readObject方法
温馨提示:内容为网友见解,仅供参考
无其他回答

java中什么是序列化,怎么通俗理解序列化和反序列化?
在 Java 中,序列化是指将一个 Java 对象转换为可以存储或传输的格式的过程。这个过程通常用于持久化对象,即将对象的状态保存到文件或数据库中,或在网络上传输对象。序列化的一个关键目的是使对象能够在不同平台、不同版本的 Java 虚拟机之间进行交换或存储,而不会丢失对象的任何状态信息。反序列化...

hessian是什么意思
Hessian是一种轻量级的二进制协议,用于在分布式环境中传输 Java 对象和调用服务。它基于 HTTP 协议并使用序列化来提供快速的数据传输,也可以使用其他传输协议(例如TCP、UDP等)。Hessian协议在数据传输的速度上具有优势,因为它使用二进制序列化方法传输数据,可以更快地传输大量数据。此外, Hessian 简化了...

Java高性能序列化工具Kryo序列化
和Hessian 类似,Kryo 序列化出的结果,是其自定义的、独有的一种格式。由于其序列化出的结果是二进制的,也即 byte[],因此像 Redis 这样可以存储二进制数据的存储引擎是可以直接将 Kryo 序列化出来的数据存进去。当然你也可以选择转换成 String 的形式存储在其他存储引擎中(性能有损耗)。基础用法 介绍了这么多,接...

Dubbo 使用哪个序列化框架最好?为什么?
其中,Hessian 和 FST 是 Dubbo 默认的序列化框架,Java 和 Kryo 是官方推荐的序列化框架,而 Protobuf、Thrift 等则是第三方开源的序列化框架。Hessian 和 FST 都是轻量级的序列化框架,性能较好,但是不支持跨语言调用。Java 和 Kryo 支持跨语言调用,但是性能较差。Protobuf 和 Thrift 是高性能的序...

DSL、fastjson、gson、jackson、protocol buffer、Thrift、Hession、Kr...
7. Hessian:一种基于XML的二进制序列化格式,支持多种语言,特别适用于分布式系统。8. Kryo:用于高效序列化Java对象的库,特别适用于游戏开发等性能要求高的场景。9. Fst:一种用于跨语言的二进制格式,支持多种语言,特别适合于需要跨语言通信的场景。10. Messagepack:一种二进制格式的序列化方式,...

Netty面试题
序列化协议是将对象转化为二进制形式的关键技术,用于网络传输和持久化。主要有几种:Java默认的序列化:存在跨语言、码流大和性能差的问题。XML:人机可读性强,但只包含数据和结构,不支持类型标识和程序集信息,且文件较大。JSON:轻量级,兼容性好,文件小,适合跨防火墙和Web browser的Ajax请求,但...

子类和父类有同样的属性,经过 hessian 序列化后值丢失是什么情况_百 ...
1、解释:简单说就是为了保存在内存中的各种对象的状态,并且可以把保存的对象状态再读出来。虽然你可以用你自己的各种各样的方法来保存ObjectStates,但是Java给你提供一种应该比你自己好的保存对象状态的机制,那就是序列化。2、什么情况下需要序列化a)当你想把的内存中的对象保存到一个文件中或者数据...

Java串行化怎么理解?什么是串行化?谁能通俗地给我讲讲?
Java 默认实现了自己的序列化,就是使用的内存数据。然而除了 Java 自己的序列化,我们还有很多中序列化方式,例如 hessian。或者说将 Java 对象转成 json、xml 也是一种序列化。举一个非常简单的例子,例如我们有一个对象 Integer v = 1;。当我们使用 hessian 对其序列化的时候,我们可能会拿到 I1 ...

序列化的原理
Hessian 是一个支持跨语言传输的二进制序列化协议,相对于 Java 默认的序列化机制来说,Hessian 具有更好的性能和易用性,而且支持多种不同的语言 实际上 Dubbo 采用的就是 Hessian 序列化来实现,只不过 Dubbo 对 Hessian 进行了重构,性能更高 Avro 是一个数据序列化系统,设计用于支持大批量数据...

HessianHessian 介绍
- 对象需实现Serializable接口,以便序列化处理。例如,User类。- 复杂对象可以使用Map传递。2. **客户端准备**:- C#项目中引用hessianCSharp.dll,Java客户端同样需要Hessian.jar。- 客户端需要拥有与服务器端相同的接口结构,包括命名空间。例如,`BasicAPI`接口和User类。- 使用HessianProxyFactory创建...

相似回答