引入

阿里的dubbo默认使用的就是hessian序列化,它的特性是:序列化的时候,会写入字段名称,然后字段值,你可以想象为一个map。

而京东jsf默认使用的是msgpack序列化,它的特性是:序列化的时候,不写入字段名字,会按字段顺序写入值,你可以想象为一个数组。

区别介绍

Hessian和Msgpack都是用于序列化和反序列化数据的二进制传输协议,但它们在实现和特性上有一些区别。

  1. 数据格式:Hessian使用基于Java的二进制格式进行序列化和反序列化,而Msgpack使用一个更轻量级的二进制数据交换格式。
  2. 编码效率:Msgpack通常在编码效率方面比Hessian更高。Msgpack的二进制表示比Hessian更紧凑,这意味着Msgpack在网络传输和存储时需要更少的字节。
  3. 数据兼容性:在数据兼容性方面,Hessian更强大。Hessian支持Java中常见的数据类型以及自定义对象的序列化和反序列化,而Msgpack支持的数据类型相对较少。
  4. 跨平台支持:Msgpack相对于Hessian在跨平台和跨语言支持方面更好。Msgpack有许多编程语言的实现,可以在不同的语言之间进行数据传输和交换。

考虑到这些区别,您可以根据您的具体需求选择使用Hessian还是Msgpack。如果您更关注编码效率和跨平台支持,可以考虑使用Msgpack。如果您需要更强大的数据兼容性和更易于理解的数据格式,可以选择Hessian。

举例说明

举个例子来展示Hessian和Msgpack的区别。

假设我们有一个简单的Java对象,例如Person类,它包含姓名和年龄属性。

public class Person {
    private String name;
    private int age;

    // 省略构造函数和访问器方法
}

现在我们将使用Hessian和Msgpack分别对该对象进行序列化和反序列化。

使用Hessian进行序列化和反序列化的示例代码如下:

// 使用Hessian序列化
ByteArrayOutputStream bos = new ByteArrayOutputStream();
HessianOutput output = new HessianOutput(bos);
output.writeObject(person);
byte[] hessianBytes = bos.toByteArray();

// 使用Hessian反序列化
ByteArrayInputStream bis = new ByteArrayInputStream(hessianBytes);
HessianInput input = new HessianInput(bis);
Person deserializedPerson = (Person)input.readObject();

使用Msgpack进行序列化和反序列化的示例代码如下:

// 使用Msgpack序列化
MessagePack msgpack = new MessagePack();
byte[] msgpackBytes = msgpack.write(person);

// 使用Msgpack反序列化
Person deserializedPerson = msgpack.read(msgpackBytes, Person.class);