2008-04-03
NotSerializableException: EnhancerByCGLIB
关键字: ibatis notserializableexception enhancerbycglib使用Ibatis时,为了获得更好的性能,我们一般都会将enhancementEnabled设为true,使用cglib。如果从ibatis获取的domain object需要序列化,这时就需要注意有可能出现如下异常:
java.io.NotSerializableException: $java.util.List$$EnhancerByCGLIB$$a80b8ab4 at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1156) at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:326) at ×××××××××××××××××××××××× at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at org.unitils.UnitilsJUnit3.runTest(UnitilsJUnit3.java:171) at org.unitils.UnitilsJUnit3.runBare(UnitilsJUnit3.java:138) at org.unitils.UnitilsJUnit3.run(UnitilsJUnit3.java:101) at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:40)
最近遇到这个问题,http://www.javaeye.com/topic/7636 也出现该问题。
经过测试,在使用IBatis "Complex Collection Properties"时会出现该问题(例子来源于ibatis文档)
<resultMap id=”get-category-result” class=”com.ibatis.example.Category”> <result property=”id” column=”CAT_ID”/> <result property=”description” column=”CAT_DESCRIPTION”/> <result property=”productList” column=”CAT_ID” select=” getProductsByCatId”/> </resultMap> <resultMap id=”get-product-result” class=”com.ibatis.example.Product”> <result property=”id” column=”PRD_ID”/> <result property=”description” column=”PRD_DESCRIPTION”/> </resultMap> <select id=”getCategory” parameterClass=”int” resultMap=”get-category-result”> select * from CATEGORY where CAT_ID = #value# </select> <select id=”getProductsByCatId” parameterClass=”int” resultMap=”get-product-result”> select * from PRODUCT where PRD_CAT_ID = #value# </select>
- productList采用ArrayList;Product, Category类实现Serializable接口。从ibatis获取Category后(productList经过cglib增强),再序列化Category会产生上述异常。
- 直接通过getProductsByCatId获取Product List(同样经过cglib增强),然后序列化该List并不会出现上述异常。
因为对cglib还不是太熟悉,个人猜测原因在于:第一种情况是直接create了一个新的List实现,而这个实现没有实现Serializable接口;第二种情况是增强了ArrayList,而ArrayList实现了Serializable接口。
目前的解决方法是,在序列化之前new 一个新的collection 自己做一次转换。
发表评论
提醒: 该博客已发表在公共论坛,博客所有留言会成为论坛回贴,留言请注意遵守论坛发贴规则
- 浏览: 42882 次
- 性别:

- 来自: 北京

- 详细资料
搜索本博客
我的相册
Snap1
共 1 张
共 1 张
最新评论
-
使用Atomikos Transaction ...
引用Caused by: com.atomikos.icatch.SysExce ...
-- by bagui3 -
Struts2中使用Stream Res ...
Stream result type? 可有可无,把Respose的header ...
-- by ray_linn -
Struts2中使用Stream Res ...
我的程序,虽然结果出来了,但后台总是抛错:------------------- ...
-- by Acaleph -
使用Atomikos Transaction ...
Caused by: com.atomikos.icatch.SysExcept ...
-- by baoyaer -
Annotation风格的Spring M ...
刚用了spring MVC的annotation, 确实简单。应该说在简化问题上 ...
-- by slaser






评论排行榜