一、问题:
hibernate的延迟加载,导致序列化的时候会抛出Hibernate的LazyInitializationException.
还有就是hibernate的Map、List等会被转换为PersistentCollection对象,一般序列化框架没有针对此类的序列化方案。
二、主要应用场景
1、hibernate对象在缓存的时候,进行序列化操作
2、hibernate对象在使用hessian的RPC操作的时候进行序列化。
3、hibernate对象在进行json对象转换的时候。
三、一班的解决方案
使用DTO/VO对象对hibernate对象进行转换,但是缺点也很明显,代码冗余非常大,DTO/VO对象泛滥。
三、现象以及二班的解决方法
1、对于场景1的解决方案(hibernate对象的缓存)
1)将需要延迟加载的对象,都改成非延迟加载。这个其实也很正常,既然需要缓存对象,又何必延迟加载呢?所以这种方案无可厚非。
2、对于场景2的解决方案(RPC的序列化)
RPC的序列化跟转换成json有个最大的不同点,就是此序列化不会调用get方法获取值,就是IO操作,所以3的方案不可用。
本人是在dubbo中用hessian进行序列化的时候碰到的问题,所以就针对此框架来说吧。
其实在上面的问题中已经描述,就是PersistentCollection对象无法识别,那么就增加对此序列化的方法呗。
public class HibernateSerializerFactory extends SerializerFactory {
private HibernateListSerializer listSerializer = new HibernateListSerializer();
private HibernateMapSerializer mapSerializer = new HibernateMapSerializer();
private HibernateBeanSerializer hibernateBeanSerializer = new HibernateBeanSerializer();
@SuppressWarnings("rawtypes")
public Serializer getSerializer(Class cl) throws HessianProtocolException {
if (PersistentMap.class.isAssignableFrom(cl)) {
return mapSerializer;
} else if (AbstractPersistentCollection.class.isAssignableFrom(cl)) {
return listSerializer;
} else if (cl.getSimpleName().contains("_$$_javassist_")) {
return hibernateBeanSerializer;
}
return super.getSerializer(cl);
}
private static class HibernateBeanSerializer implements Serializer {
@Override
public void writeObject(Object obj, AbstractHessianOutput out) throws IOException {
boolean init = Hibernate.isInitialized(obj);
out.writeObject(init ? obj : null);
out.flush();
return;
}
}
private static class HibernateListSerializer implements Serializer {
private CollectionSerializer delegate = new CollectionSerializer();
@SuppressWarnings({"unchecked", "rawtypes"})
public void writeObject(Object obj, AbstractHessianOutput out) throws IOException {
if (Hibernate.isInitialized(obj)) {
delegate.writeObject(new ArrayList((Collection) obj), out);
} else {
delegate.writeObject(new ArrayList(), out);
}
}
}
private static class HibernateMapSerializer implements Serializer {
private MapSerializer delegate = new MapSerializer();
@SuppressWarnings({"unchecked", "rawtypes"})
public void writeObject(Object obj, AbstractHessianOutput out) throws IOException {
if (Hibernate.isInitialized(obj)) {
delegate.writeObject(new HashMap((Map) obj), out);
} else {
delegate.writeObject(new HashMap(), out);
}
}
}
}
dubbo中通过添加配置文件,可以增加自己的序列化工厂。
3、对于场景3的现象与方案(hibernate进行json对象转换)
1) Hibernate碰到延迟加载的属性访问时如果session被关闭则抛出LazyInitializationException
2) Hibernate中的one-to-many等关联关系在序列化时如果没有控制,则将整个 数据库都有可能被全部序列化
3) 过多的使用DTO/ValueObject解决这个问题。
解决办法:
1、可以使用阿里巴巴的fastjson,对这种一对多或多对一的对象序列化做到了可控性,通过在序列化的时候添加SerializerFeature中的DisableCircularReferenceDetect即可。至于延迟加载可以用OpenSessionInView,这个也只局限于web才可以。
2、对Entity对象生成一个动态代理,拦截getXXXX()方法,如果访问的是延迟加载的属性,则return null,而不抛出LazyInitializationException,递归生成属性的代理,只要碰到未延迟加载的属性,而序列化会自动停止.避免将整个Entity序 列化传播,导致可能序列化整个数据库的问题。
- 大小: 6.3 KB
分享到:
相关推荐
在IT行业中,分布式服务框架Dubbo是阿里巴巴开源的一款高性能、轻量级的服务治理方案,它使得服务提供者可以在一个系统中发布服务,而服务消费者可以在任何地方调用这些服务。Hessian是Apache的一个子项目,它是一种...
Dubbo 提供了多种序列化方式,其中之一就是 Hessian 序列化,而 hessian-lite 是 Dubbo 在编译时依赖的一个轻量级 Hessian 实现。在实际开发过程中,可能会遇到由于阿里的网络限制导致无法直接获取 hessian-lite 这...
在Dubbo中,Hessian Lite被用作服务调用的序列化/反序列化工具,使得服务间通信更加高效和便捷。 描述中提到的 "可以使用mvn install命令将jar包安装到本地的maven仓库" 是一个常见的Maven操作。Maven是一个项目...
在Dubbo中,Hessian协议同样可以被用于服务的远程调用,它提供了比RMI更快的序列化和反序列化速度,特别适合于需要高效率通信的场景。 要使用Dubbo与RMI或Hessian集成,我们需要进行以下步骤: 1. **配置服务提供...
Hessian Lite(Apache Dubbo专用版) Hessian-lite最初是的Apache dubbo嵌入版本。 然后,此模块与Dubbo分离。 所有分支:2.5.x,2.6.x(自2.6.3起)和2.7.x都依赖于它,请查看详细信息: 现在,我们正在尝试建立一...
整合 Dubbo + SpringMvc 4.3.1 的服务器maven工程样例,使用注解方式定义服务及IOC装配,采用Hessian协议传输 三个工程,在 cnetAdmin 和 cnetBlu 中,要引用 cnetCommon 工程。
当服务接口中的BO(Business Object,业务对象)未实现序列化时,服务注册时可能会遇到问题,因为Dubbo在传输过程中通常需要将对象转换为字节流,这就涉及到了对象的序列化。 对象序列化是Java中一个重要的概念,它...
默认就是⾛ dubbo 协议,单⼀⻓连接,进⾏的是 NIO 异步通信,基于 hessian 作为序列化协议。使⽤的场景是:传输数据量⼩ (每次请求在 100kb 以内),但是并发量很⾼。 为了要⽀持⾼并发场景,⼀般是服务提供者就⼏...
标题 "34_dubbo都支持哪些通信协议以及序列化协议?" 暗示了我们即将探讨的是关于Dubbo框架在网络通信和数据序列化方面的内容。Dubbo是阿里巴巴开源的一个高性能、轻量级的Java服务治理框架,它为分布式应用提供了...
在Dubbo中,序列化协议是实现RPC通信的关键部分,因为它涉及到数据的转换和网络传输。 1. **Dubbo支持的通信协议**: - **Dubbo协议**:默认协议,采用单个长连接和NIO异步通信,基于Hessian进行序列化。适用于大...
在IT行业中,分布式服务框架Dubbo与持久层框架Hibernate是两个非常重要的技术组件。本示例结合了两者,提供了一个完整的分层架构,用于展示如何在实际开发中使用它们。Dubbo作为一个高性能、轻量级的RPC(远程过程...
虽然阿里已经给我们打包好了核心框架的jar包,但在实际开发过程中,核心框架、管理控制台、简易监控中心、简易注册中心可能我们都需要用到,而且业务需求可能要修改dubbo源码,再次打包。基于以上原因我们需要构建...
工具仅用于安全研究以及内部自查,禁止使用工具发起非法攻击,造成的后果使用者负责Dubbo反序列化测试工具使用帮助usage: java -jar exp.jar [OPTION]-h --help 帮助信息-l --list 输出所有gadget信息-g --gadget ...
dubbo可视化工具
总结,Dubbo的稳定运行需要关注服务发布、注册中心状态、网络环境、线程池配置、序列化过程以及启动配置等多个方面。通过细致的排查和优化,可以有效地提高系统的稳定性和可靠性。在面对问题时,开发者应具备清晰的...
总之,解决`dubbo.xsd`报红叉的问题需要从多个方面进行排查,包括检查XML语法、确认xsd引用、匹配版本、修正IDE配置、处理编码问题以及解决网络问题。通过以上步骤,一般能够成功消除红叉错误,恢复正常的工作流程。
描述进一步提到,“nodejs 使用原生的 dubbo (dubbo head hessian body) 协议”,这表明在Node.js中,开发者不仅实现了Dubbo的协议头(head),还处理了Hessian二进制序列化协议作为消息体(body)。Hessian是一种...
序列化是远程调用中必不可少的一环,Dubbo支持多种序列化方式,如Java自带的序列化、Hessian2、FastJson等。选择合适的序列化方式可以影响到系统的性能和兼容性。 8. **容错机制** Dubbo提供了多种容错策略,如...