`

NotSerializableException: EnhancerByCGLIB

    博客分类:
  • java
阅读更多

使用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 自己做一次转换。

 

 

 

 


 

 

 

分享到:
评论

相关推荐

    java 中序列化NotSerializableException问题解决办法

    Java 中序列化 NotSerializableException 问题解决办法 Java 中序列化 NotSerializableException 问题是 Java 开发中常见的问题之一。 NotSerializableException 是 Java 中的一个异常,它发生在尝试序列化一个不...

    7.7初始mybatis个人笔记.docx

    在【描述】中提到的问题,当你尝试启用二级缓存时,如果实体类没有实现`Serializable`接口,MyBatis在尝试序列化对象存储到缓存时会抛出`java.io.NotSerializableException`。这是因为Java的序列化机制要求可序列化...

    struts2 依赖核心包 --xwork 源文件

    Struts2是一个强大的Java web应用程序框架,它基于MVC(Model-View-Controller)设计模式,为开发人员提供了构建高效、可维护性高的Web应用的工具。XWork是Struts2的核心组件,它负责处理Action的业务逻辑和控制流程...

    java session

    java.io.NotSerializableException: xxxxxx ``` 3. **解决方法** - **方法一**: 配置Tomcat不在关闭时保存Session数据。 在`server.xml`文件中的`&lt;Context&gt;`标签下添加以下内容: ```xml ``` 这样...

    IOException 代码

    - `NotSerializableException`:当尝试序列化一个不可序列化的对象时抛出。 #### 知识点三:使用try-catch处理IOException 在Java中,任何可能抛出`IOException`的方法调用都需要放在try块中,并通过catch块捕获...

    java自动序列化

    3. `java.io.NotSerializableException`: 当尝试序列化一个未实现Serializable接口的对象时抛出的异常。 4. `sun.misc.BASE64Encoder`和`sun.misc.BASE64Decoder`(非标准API):用于将字节数组编码为Base64字符串,...

    2021-2022计算机二级等级考试试题及答案No.9484.docx

    21. Java对象序列化:使用ObjectInputStream和ObjectOutputStream进行对象的序列化和反序列化时,对象必须实现Serializable接口,否则会抛出NotSerializableException异常。正确答案:正确。 22. ASP.NET访问SQL ...

    Java 常见问题解决集合.docx

    **6.1 问题:** "NotSerializableException" **解决:** 当尝试序列化一个未实现`Serializable`接口的类时,会抛出此异常。解决方法是: - **实现Serializable接口:** 确保所有需要被序列化的类都实现了`...

    SCJP认证考试题库1.pdf

    如果一个类实现了序列化,但其成员变量没有实现,那么在尝试序列化时会抛出`NotSerializableException`。 2. **流程控制**: - **异常处理**:在Java中,异常处理通过`try-catch-finally`块进行。当在`try`块中...

    2021-2022计算机二级等级考试试题及答案No.3684.docx

    ### 计算机二级等级考试知识点解析 #### 题目1: 数据处理与表的创建 - **知识点概述**: ... - 如果没有实现`Serializable`接口,则会出现`NotSerializableException`异常。 - **正确答案**: 正确 ##...

    Java中常见的异常以及解决方案

    当尝试通过`java.io.ObjectOutputStream`序列化一个未实现`Serializable`接口的对象时,会引发`NotSerializableException`。 **原因分析:** 序列化是将对象状态转换为可以持久化或通过网络传输的形式的过程。Java...

    Java面试题,jsp&servlet面试题

    - **实现Serializable接口**:如果一个类需要序列化,那么这个类必须实现java.io.Serializable接口,否则序列化过程会抛出NotSerializableException。 7. **集合框架**: - **List和Set**:它们都继承自...

    2021-2022计算机二级等级考试试题及答案No.3126.docx

    7. Java对象序列化:Java中的`ObjectInputStream`和`ObjectOutputStream`用于对象的输入输出,但对象必须实现`Serializable`接口才能被序列化,否则会抛出`NotSerializableException`异常。 8. Excel函数:在Excel...

    JAVA常见异常...........

    5. **NotSerializableException**:不能序列化异常,当试图序列化一个未实现`Serializable`接口的对象时抛出。解决方法是使需要序列化的类实现`Serializable`接口。 ```java public class SerializableClass ...

    2021-2022计算机二级等级考试试题及答案No.15344.docx

    否则,程序将抛出`NotSerializableException`异常。 3. C语言循环:给定的C程序是一个简单的累加器,循环条件为`i ,因此会执行6次,输出结果为6,正确答案为D。 4. 系统软件与应用软件:管理和控制计算机系统全部...

    SCJP 310-055 2008-01-07题库

    由于`Tree`类未实现`Serializable`接口,尝试序列化包含`Tree`实例的`Forest`对象会导致运行时抛出`NotSerializableException`异常。 #### 题目2: 反序列化问题 - **题目描述**:为了使类能够被正确地序列化和反...

    2021-2022计算机二级等级考试试题及答案No.13751.docx

    3. 对象序列化:Java中的`ObjectInputStream`和`ObjectOutputStream`用于对象的序列化和反序列化,对象需要实现`Serializable`接口才能进行序列化操作,否则会抛出`NotSerializableException`异常。 4. Access...

    2021-2022计算机二级等级考试试题及答案No.9392.docx

    否则,使用`ObjectInputStream`和`ObjectOutputStream`时会出现`NotSerializableException`异常。 3. Internet在中国的称呼:Internet在中国通常被称为“因特网”或“国际互联网”。 4. 需求分析阶段的任务:需求...

    spring整合quartz常见问题

    当尝试将不能被序列化的对象存储到数据库时,会抛出`NotSerializableException`异常。具体表现为无法将MethodInvokingJobDetailFactoryBean实例的属性序列化为数据库中的BLOB字段。 **解决方案**: - **方案一**: ...

Global site tag (gtag.js) - Google Analytics