假如有如下类,Customer和Order,在使用Hessian序列化Customer时,如果orders延迟加载,并且序列化时Hibernate的session已经关闭,则会抛出Hibernate的LazyInitializationException.
@Entity
public class Customer implements java.io.Serializable {
@Id
private long id;
private String name;
//一对多,延迟加载
@OneToMany(fetch=FetchType.LAZY)
@JoinColumn(name="CUSTOMER_ID")
private Set<Order> orders;
...........
@Entity
public class Order implements java.io.Serializable{
@Id
private long id;
.......
该Set为Hibernate的PersistentSet,是Hibernate的PersistentCollection的子类。原因是Hessian序列化时,会调用PersistentSet的方法导致Hibernate从session里加载数据,如果session已经关闭,就会抛出异常,导致序列化出错。不仅Set会出现,PersistentCollection的其他子类也会出现该现象,如PersistentList,PersistentBag,PersistentMap等。使用JDK的序列化不会出现该现象。
解决方案如下,可以为Hibernate的PersistentColletion定制一个Serializer,代码如下:
import com.caucho.hessian.io.AbstractHessianOutput;
import com.caucho.hessian.io.AbstractSerializer;
import com.caucho.hessian.io.CollectionSerializer;
import com.caucho.hessian.io.MapSerializer;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import org.hibernate.Hibernate;
import org.hibernate.collection.PersistentMap;
public class HibernateSerializer extends AbstractSerializer {
CollectionSerializer collectionSeiralizer = new CollectionSerializer();
MapSerializer mapSerializer = new MapSerializer();
@Override
public void writeObject(Object obj, AbstractHessianOutput out) throws IOException {
boolean init = Hibernate.isInitialized(obj);
if (init) {
out.writeObject(obj);
out.flush();
return;
}
if (PersistentMap.class.isAssignableFrom(obj.getClass())) {
//将没有初始化的Map序列化空的HashMap
mapSerializer.writeObject(new HashMap(), out);
} else {
//将没有初始化的List,Set等序列化为空的ArrayList
collectionSeiralizer.writeObject(new ArrayList(), out);
}
}
}
同时还需要定制一个序列化工厂SerializerFactory,代码如下:
import com.caucho.hessian.io.HessianProtocolException;
import com.caucho.hessian.io.Serializer;
import com.caucho.hessian.io.SerializerFactory;
import org.hibernate.collection.PersistentCollection;
public class HibernateSerializerFactory extends SerializerFactory {
@Override
public Serializer getSerializer(Class cl) throws HessianProtocolException {
//Hibernate的集合API使用为HibernateSerializer序列化
if (PersistentCollection.class.isAssignableFrom(cl)) {
return new HibernateSerializer();
}
return super.getSerializer(cl);
}
}
可以调用HessianServlet.getSerializerFactory().addFactory()添加HibernateSerializerFactory 来使用该HibernateSerializer序列化Hibernate的PersistentCollection.
或者写一个serializers文件放到classpath的META-INF/hessian/目录下,该文件的内容为
org.hibernate.collection.PersistentCollection=HibernateSerializer
分享到:
相关推荐
这对于优化自定义序列化逻辑或者解决Hessian使用中遇到的问题非常有帮助。 总结起来,Hessian是一种高效、轻量级的二进制序列化协议,特别适合于跨语言的网络通信。理解并掌握Hessian的基本概念和使用方法,能够...
总结,Hessian序列化规范是分布式系统中的重要工具,理解其原理和使用方法,能够帮助我们构建高效、可靠的跨网络通信方案。然而,任何工具都有其适用场景,选择最合适的序列化协议应根据项目需求和性能要求来决定。
在IT行业中,序列化是一个非常重要的概念,尤其是在分布式系统、网络通信和持久化存储等领域。Hessian是一种二进制的序列化协议,由Caucho公司开发,它旨在提供高效、轻量级的数据交换方式。本文将围绕"Hessian的...
【S25-Hessian反序列化1】是一个关于Java中Hessian序列化库的讨论,主要涉及Hessian与原生Java序列化的差异以及在Spring框架中的应用。Hessian是一种二进制序列化协议,旨在提高远程过程调用(RPC)的效率。与原生Java...
Java序列化和Hessian序列化的差异 Java序列化和Hessian序列化是两种常用的序列化机制,它们都可以将对象转换为字节流,以便在网络上传输。但是,两者之间有着很大的差异,今天我们就来比较一下它们的实现机制和特点...
《Hessian 2.0序列化协议规范》 在分布式计算和网络通信中,数据的序列化和反序列化是至关重要的环节。Hessian 2.0是一种高效的二进制序列化协议,它旨在减少网络传输的数据量,提高数据交换的效率。本文将详细介绍...
在Hessian-RMI架构中,Hibernate可以用来处理数据的持久化。通过Hessian调用的远程服务,可以封装Hibernate的操作,使得客户端可以透明地操作数据库。 5. **Ibatis**: Ibatis是另一种轻量级的SQL映射框架,它可以...
### Nacos JRaft Hessian 反序列化 RCE 分析 #### 一、背景介绍 Nacos 是阿里巴巴开源的一款易于构建云原生应用的动态服务发现、配置管理和服务管理平台。JRafT 是 SOFAStack 微服务平台中的一个分布式一致性组件...
Hessian提供了透明的序列化和反序列化机制,使得Java对象可以直接跨网络进行传输。通过Hessian,开发者可以轻松地创建分布式服务,实现服务端与客户端之间的高效通信。 Spring MVC、Hibernate和Hessian的整合通常...
removal RCE、Hessian 反序列化、Yaml反序列化、密码解密、部分常用敏感路径(漏洞更新截止2024.9.12)
这样,客户端通过网络发送一个Hessian序列化的请求,服务端接收后反序列化为本地对象,然后执行相应的操作,再序列化结果返回给客户端。 在实际应用中,Hessian主要应用于以下场景: 1. **分布式服务调用**:通过...
2. **简单类型支持**:Hessian支持基本的Java数据类型,如整型、浮点型、字符串、日期等,并且可以序列化和反序列化复杂对象。 3. **流式传输**:Hessian协议允许数据分块传输,这意味着服务端可以立即响应部分结果...
Hessian可以序列化和反序列化List和Map类型的集合,无论是基本类型还是自定义对象的集合。在Java端,`List`和`Map`会被转换成Hessian的特定格式,而在C#端,HessianNet会解析这些格式并创建相应的`ArrayList`或`...
在Spring+iabtis框架中,增加hessian接口,要实现以下几点: 1.绕过系统本身的认证,拦截器直接将该实现方法的servlet直接调用,需要重写拦截器。 2.由于绕过了spring和Struts,请求没有经过封装的事物管理器实例化,...
总的来说,Hessian提供了高效、轻量级的跨语言通信解决方案,尤其适合对性能有较高要求的场景。通过学习和实践这个Hessian demo,你将能够更好地应对涉及远程调用和数据交换的问题。无论是Java开发者还是C++开发者,...
在IT行业中,Hessian是一种二进制序列化协议,它被广泛用于远程方法调用(RMI)和Web服务中,以提高数据传输效率。Hessian由Caucho Technology开发,其目标是提供轻量级、高效的通信方式,特别是在网络带宽有限的...
为了能够通过Hessian进行序列化和反序列化,实体类需要遵循特定的规则,例如字段类型要简单,避免复杂的嵌套结构。 3. **服务发布**: - 在服务器端,需要将实现类绑定到一个特定的URL,以便客户端可以通过该URL...
例如,`Hessian2Input`和`Hessian2Output`类分别用于反序列化和序列化对象。它们通过读写字节流来处理各种数据类型,包括基本类型、对象引用、集合和自定义类等。 2. **HTTP通信**:在"**com.caucho.hessian.client...
Hessian由Caucho Technology开发,旨在提供轻量级、高性能的远程调用解决方案。在这个案例中,我们关注的是Hessian的版本4.0.37,即"hessian4.0.37.jar"。 Hessian4.0.37是Hessian协议的一个稳定版本,提供了对Java...