`

hessian学习基础篇——序列化和反序列化

OS 
阅读更多

1、概念介绍

   把Java对象转换为字节序列的过程称为对象的序列化。
   把字节序列恢复为Java对象的过程称为对象的反序列化。

   对象的序列化主要有两种用途:
  1) 数据介质存储
  2) 数据网络传输

2、对象序列化实例

     为了更好的理解hessian的序列化机制,所以把java和hessian的对象序列化实例都一一列出。

      1)对象序列化--java

	public byte[] serialize(Object obj) throws Exception {
		if(obj==null) throw new NullPointerException();
		
		ByteArrayOutputStream os = new ByteArrayOutputStream();
		ObjectOutputStream out = new ObjectOutputStream(os);
		out.writeObject(obj);
		return os.toByteArray();
	}
	
	public Object deserialize(byte[] by) throws Exception {
		if(by==null) throw new NullPointerException();
		
		ByteArrayInputStream is = new ByteArrayInputStream(by);
		ObjectInputStream in = new ObjectInputStream(is);
		return in.readObject();
	}

 

      2)对象序列化--hessian (hessian2的序列化方式在附件中)

 

	public byte[] serialize(Object obj) throws IOException{
		if(obj==null) throw new NullPointerException();
		
		ByteArrayOutputStream os = new ByteArrayOutputStream();
		HessianOutput ho = new HessianOutput(os);
		ho.writeObject(obj);
		return os.toByteArray();
	}

	public Object deserialize(byte[] by) throws IOException{
		if(by==null) throw new NullPointerException();
		
		ByteArrayInputStream is = new ByteArrayInputStream(by);
		HessianInput hi = new HessianInput(is);
		return hi.readObject();
	}

 

         从以上代码不难看出,对象序列化的过程为:

         先将对象转为字节码或其它,然后再将其还原为对象。在反序列化时,内存中必须有源对象的所属类。

 

3、对象序列化效率

     hessian2在这方面有了很大的改进,所以优势十分明显。具体细节不再详述,在进阶篇中,我会详述序列化的实现细节。在此仅把实例执行结果公布出来:

java:
77
stxm

hessian:
41
stxm

hessian2:
30
stxm

说明:
1、数字为对象序列化后的字节长度。
2、‘stxm’为对象方法的执行结果。

 

    hessian2的优点,谁用谁知道。待我再做深入研究之后,再把我自己认为的和大家认为的优点总结一下,并加以解释。

 

分享到:
评论
6 楼 lionbule 2011-11-23  
请参考如下性能测试结果:
http://code.google.com/p/thrift-protobuf-compare/wiki/Benchmarking
5 楼 gaopengxiang417 2011-11-20  
dongbiying 写道
我测试怎么java的序列化时间比hessian的少呢,
你测试的是对象吗 ?


public static void main(String[] args) throws IOException {

//hessian
Long startLong = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
byte[] bytes = javaSerialize(new User("dby"+i));
}
System.out.println("-----java--"+(System.currentTimeMillis()-startLong));

startLong = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
byte[] bytes = serialize2(new User("dby"+i));
}
System.out.println("-----hessian2--"+(System.currentTimeMillis()-startLong));

startLong = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
byte[] bytes = serialize(new User("dby"+i));
}
System.out.println("-----hessian--"+(System.currentTimeMillis()-startLong));

}

public static byte[] serialize(Object obj) throws IOException{
if(obj==null) throw new NullPointerException();

ByteArrayOutputStream os = new ByteArrayOutputStream();
HessianOutput ho = new HessianOutput(os);
ho.writeObject(obj);
return os.toByteArray();
}

public static Object deserialize(byte[] by) throws IOException{
if(by==null) throw new NullPointerException();

ByteArrayInputStream is = new ByteArrayInputStream(by);
HessianInput hi = new HessianInput(is);
return hi.readObject();
}

public static byte[] serialize2(Object obj) throws IOException{
if(obj==null) throw new NullPointerException();

ByteArrayOutputStream os = new ByteArrayOutputStream();
Hessian2Output ho = new Hessian2Output(os);
ho.writeObject(obj);
return os.toByteArray();
}

public static Object deserialize2(byte[] by) throws IOException{
if(by==null) throw new NullPointerException();

ByteArrayInputStream is = new ByteArrayInputStream(by);
Hessian2Input hi = new Hessian2Input(is);
return hi.readObject();
}

public static byte[] javaSerialize(Object obj) throws IOException{
if(obj==null) throw new NullPointerException();

ByteArrayOutputStream os = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(os);
oos.writeObject(obj);
return os.toByteArray();
}

public static Object javaDeserialize(byte[] by) throws IOException, ClassNotFoundException{
if(by==null) throw new NullPointerException();  
      
    ByteArrayInputStream is = new ByteArrayInputStream(by);  
    ObjectInputStream in = new ObjectInputStream(is);  
    return in.readObject();  
}

这是我的测试代码 ,请指教呀!







hession不是说序列化的时候时间减少,而是序列化以后在网络上传输的时候能够减少时间(因为流中的字节数减少了一半).
4 楼 dongbiying 2011-11-16  
我测试怎么java的序列化时间比hessian的少呢,
你测试的是对象吗 ?


public static void main(String[] args) throws IOException {

//hessian
Long startLong = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
byte[] bytes = javaSerialize(new User("dby"+i));
}
System.out.println("-----java--"+(System.currentTimeMillis()-startLong));

startLong = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
byte[] bytes = serialize2(new User("dby"+i));
}
System.out.println("-----hessian2--"+(System.currentTimeMillis()-startLong));

startLong = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
byte[] bytes = serialize(new User("dby"+i));
}
System.out.println("-----hessian--"+(System.currentTimeMillis()-startLong));

}

public static byte[] serialize(Object obj) throws IOException{
if(obj==null) throw new NullPointerException();

ByteArrayOutputStream os = new ByteArrayOutputStream();
HessianOutput ho = new HessianOutput(os);
ho.writeObject(obj);
return os.toByteArray();
}

public static Object deserialize(byte[] by) throws IOException{
if(by==null) throw new NullPointerException();

ByteArrayInputStream is = new ByteArrayInputStream(by);
HessianInput hi = new HessianInput(is);
return hi.readObject();
}

public static byte[] serialize2(Object obj) throws IOException{
if(obj==null) throw new NullPointerException();

ByteArrayOutputStream os = new ByteArrayOutputStream();
Hessian2Output ho = new Hessian2Output(os);
ho.writeObject(obj);
return os.toByteArray();
}

public static Object deserialize2(byte[] by) throws IOException{
if(by==null) throw new NullPointerException();

ByteArrayInputStream is = new ByteArrayInputStream(by);
Hessian2Input hi = new Hessian2Input(is);
return hi.readObject();
}

public static byte[] javaSerialize(Object obj) throws IOException{
if(obj==null) throw new NullPointerException();

ByteArrayOutputStream os = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(os);
oos.writeObject(obj);
return os.toByteArray();
}

public static Object javaDeserialize(byte[] by) throws IOException, ClassNotFoundException{
if(by==null) throw new NullPointerException();  
      
    ByteArrayInputStream is = new ByteArrayInputStream(by);  
    ObjectInputStream in = new ObjectInputStream(is);  
    return in.readObject();  
}

这是我的测试代码 ,请指教呀!
3 楼 J-catTeam 2010-11-28  
haiyupeter 写道
如果能把序列化后的字节减少,那么问一下会带来多少CPU的损耗。

不会的,hessian序列化快的原因是因为它的描述信息比java的少,他用简单的方式描述必要的信息。采取键值对的方式。 所以在序列化一些复杂对象上是有问题的
2 楼 lionbule 2010-08-29  
haiyupeter 写道
如果能把序列化后的字节减少,那么问一下会带来多少CPU的损耗。

我坚信“能量守恒定律”。不管哪种方法,只要在实现原理上没有进行彻底的革新,就不会有太大的改观。

换句话说,不是用空间换时间,就是用时间换空间。

所以我们更多关注的应该是实现原理,多看源码就晓得其实每个都差不多。

如果有一天能是“汽车换马车”,就会有很大进步了。期望……
1 楼 haiyupeter 2010-08-16  
如果能把序列化后的字节减少,那么问一下会带来多少CPU的损耗。

相关推荐

    CXF+RMI+HESSIAN

    这涉及到在CXF的配置文件中添加相关配置,指示CXF使用Hessian编码器进行序列化和反序列化。 4. 创建RMI注册表:启动RMI注册表,使得远程对象可以被找到和调用。 5. 客户端调用:在客户端,我们创建一个代理对象,...

    RPC 框架学习 好的参考学习

    - 序列化模块通常是可插拔的,QiuRPC可能内置支持JSON、Hessian、Protobuf等多种序列化方式,开发者可以根据性能和需求选择合适的序列化库。 5. **负载均衡与容错**: - QiuRPC可能会提供简单的负载均衡策略,如...

    dubbo精品课程-基础篇

    5. **协议与序列化**:讨论Dubbo支持的通信协议,如`dubbo`、`rmi`、`http`等,以及各种序列化方式,如`Hessian2`、`FastJson`等,分析它们的优缺点和适用场景。 6. **负载均衡策略**:介绍Dubbo内置的多种负载均衡...

    dubbo-demo

    当服务消费者调用服务接口时,Dubbo会处理底层的网络通信,如TCP连接,并执行序列化和反序列化操作。Dubbo提供了多种协议供选择,如RPC协议、HTTP协议等,以及多种序列化方式,如Hessian、Java自带的序列化等。此外...

    dubbo_rpc_hession_rmi

    Hessian则通过序列化和反序列化机制实现远程调用,其性能相比纯HTTP协议有显著提升。 总结,"dubbo_rpc_hession_rmi"这个主题涵盖了Dubbo作为RPC框架的核心概念,Hessian作为RPC协议的实现,以及RPC基础理论。通过...

    Android开发项目怎样快速开发框架

    Hessian是一种二进制Web服务协议,它能高效地处理Java对象的序列化和反序列化。在Android开发中,Hessian用于客户端和服务端之间的通信,可以减少数据传输的开销,提高网络通信的效率。通过Hessian,Android应用可以...

    dubbo官方demo

    在Demo中,通常会默认使用Dubbo协议和Hessian序列化。 6. **服务暴露与引用(Service Export & Reference)**:服务提供者通过`&lt;dubbo:service&gt;`标签暴露服务,而服务消费者通过`&lt;dubbo:reference&gt;`标签引用服务。...

    dubbox框架源码和使用实例

    除了基础的使用,深入学习 Dubbox 还包括了解其内部工作原理,如 Remoting 层的通信机制、序列化与反序列化过程、服务治理策略的实现等。此外,结合实际业务场景,学习如何利用 Dubbox 的扩展点实现定制化功能,如...

    hession之经典入门例子

    Hession能自动序列化和反序列化对象,使得远程调用像本地方法调用一样简单。与JSON或XML相比,Hession的二进制格式在传输效率上有着显著的优势。 接下来,我们来看看"springHessianClient"这个压缩包中的文件,这是...

    dubbo最新全面深度解读

    序列化是远程调用中必不可少的一环,Dubbo支持多种序列化方式,如Java自带的序列化、Hessian2、FastJson等。选择合适的序列化方式可以影响到系统的性能和兼容性。 8. **容错机制** Dubbo提供了多种容错策略,如...

    Dubbo高级视频教程

    - **网络传输优化**:使用更高效的序列化协议(如Hessian2)以及TCP连接复用技术。 - **并发模型**:合理设置线程池大小以平衡资源利用率和响应时间。 - **服务拆分与模块化**:遵循微服务架构原则,合理拆分服务并...

    springboot-httpinvoker-demo.zip

    3. 数据传输:请求和响应的数据都通过HTTP协议进行传输,Spring会自动处理对象的序列化和反序列化。 4. 异常处理:HTTP Invoker支持异常的透明传播,客户端可以捕获到服务器端抛出的异常,从而进行相应的处理。 四...

    dubbox源代码

    此外,Dubbox 支持多种序列化方式,如 Hessian2、FastJson、Java自带的序列化等。源代码展示了如何根据配置选择合适的序列化算法,并进行数据的编码和解码。 4. **负载均衡策略** 为了提高系统的可用性和响应速度...

    dubbo初体验

    除此之外,Dubbo还支持多种通信协议和序列化方式,如RPC协议、HTTP协议,Hessian、Fastjson等序列化库,以适应不同的场景需求。它还具备强大的容错机制,如失败重试、降级策略、隔离策略等,保证了服务的高可用性。 ...

    dubbo源码解析

    综上所述,阅读和理解Dubbo源码需要较为扎实的Java基础和丰富的框架应用经验,对于希望深入学习分布式系统和服务治理的开发者来说,Dubbo是一个非常好的学习案例。通过本文的详细分析,可以帮助读者快速掌握Dubbo的...

    基于Dubbo分布式系统架构视频教程,

    5. **协议与序列化**:讨论Dubbo支持的多种通信协议(如HTTP、TCP、RMI等)和序列化方式(如Hessian、JSON等),以及如何选择合适的组合。 6. **服务注册与发现**:介绍ZooKeeper作为注册中心的角色,以及服务元...

    2018最新Dubbo视频教程

    此外,Dubbo还提供了多种序列化方式(如Hessian、JSON等)来满足不同场景下的性能需求。 #### 负载均衡 为了提升服务调用效率和可靠性,Dubbo内置了多种负载均衡策略,如随机算法、轮询算法以及最少活跃调用数算法...

    第二课:快速掌握Dubbo常规应用 (1)1

    它支持多种传输协议(如TCP、HTTP等)和序列化方式(如Hessian、JSON等),确保了跨语言的互操作性。此外,Dubbo还提供了服务治理的功能,包括服务注册、服务发现、调用路由等,使得微服务架构的构建和维护更加便捷...

    dubbo入门案例

    Dubbo支持多种通信协议,如RPC(Remote Procedure Call)和HTTP,以及多种序列化方式,如Hessian和Fastjson。 在"edu-service-user"这个入门案例中,我们可以看到一个基础的服务提供者和服务消费者的构建。"edu-...

Global site tag (gtag.js) - Google Analytics