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.iteye.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>
 
  1. productList采用ArrayList;Product, Category类实现Serializable接口。从ibatis获取Category后(productList经过cglib增强),再序列化Category会产生上述异常。 
  2. 直接通过getProductsByCatId获取Product List(同样经过cglib增强),然后序列化该List并不会出现上述异常。

因为对cglib还不是太熟悉,个人猜测原因在于:第一种情况是直接create了一个新的List实现,而这个实现没有实现Serializable接口;第二种情况是增强了ArrayList,而ArrayList实现了Serializable接口。

目前的解决方法是,在序列化之前new 一个新的collection 自己做一次转换。

 

 

 

 


 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值