java.io.NotSerializableException: org.hibernate.util.MarkerObject解决办法

本文介绍了解决在使用Hibernate框架时遇到的java.io.NotSerializableException异常的方法,通过更新hibernate-core版本可以避免序列化问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

java.io.NotSerializableException: org.hibernate.util.MarkerObject
      at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1156)
      at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:326)
      at
org.hibernate.engine.StatefulPersistenceContext.serialize(StatefulPersistenceContext.java:1368)
      at org.hibernate.impl.SessionImpl.writeObject(SessionImpl.java:1976)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
     at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      at java.lang.reflect.Method.invoke(Method.java:597)
      at
java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:945)
      at
java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1461)
      at
java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392)
      at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150)
      at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:326)
      at java.util.HashMap.writeObject(HashMap.java:1001)
      at sun.reflect.GeneratedMethodAccessor399.invoke(Unknown Source)
     at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      at java.lang.reflect.Method.invoke(Method.java:597)
      at
java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:945)
      at
java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1461)
      at
java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392)
      at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150)
      at
java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1509)
      at
java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:416)
      at
org.springframework.webflow.core.collection.LocalAttributeMap.writeObject(LocalAttributeMap.java:327)
      at sun.reflect.GeneratedMethodAccessor468.invoke(Unknown Source)
     at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      at java.lang.reflect.Method.invoke(Method.java:597)
      at
java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:945)
      at
java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1461)
      at
java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392)
      at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150)
      at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:326)
      at
org.springframework.webflow.engine.impl.FlowSessionImpl.writeExternal(FlowSessionImpl.java:154)
      at
java.io.ObjectOutputStream.writeExternalData(ObjectOutputStream.java:1421)
      at
java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1390)
      at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150)
      at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:326)
      at java.util.LinkedList.writeObject(LinkedList.java:943)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
     at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      at java.lang.reflect.Method.invoke(Method.java:597)
      at
java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:945)
      at
java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1461)
      at
java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392)
      at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150)
      at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:326)
      at
org.springframework.webflow.engine.impl.FlowExecutionImpl.writeExternal(FlowExecutionImpl.java:312)
      at
java.io.ObjectOutputStream.writeExternalData(ObjectOutputStream.java:1421)
      at
java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1390)
      at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150)
      at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:326)
      at
org.springframework.webflow.execution.repository.snapshot.SerializedFlowExecutionSnapshot.serialize(SerializedFlowExecutionSnapshot.java:173)
      at
org.springframework.webflow.execution.repository.snapshot.SerializedFlowExecutionSnapshot.<init>(SerializedFlowExecutionSnapshot.java:70)
      at
org.springframework.webflow.execution.repository.snapshot.SerializedFlowExecutionSnapshotFactory.createSnapshot(SerializedFlowExecutionSnapshotFactory.java:70)
      at
org.springframework.webflow.execution.repository.snapshot.AbstractSnapshottingFlowExecutionRepository.snapshot(AbstractSnapshottingFlowExecutionRepository.java:75)
      at
org.springframework.webflow.execution.repository.impl.DefaultFlowExecutionRepository.putFlowExecution(DefaultFlowExecutionRepository.java:126)
      at
org.springframework.webflow.executor.FlowExecutorImpl.resumeExecution(FlowExecutorImpl.java:171)
      at
org.springframework.webflow.mvc.servlet.FlowHandlerAdapter.handle(FlowHandlerAdapter.java:183)
      at
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:790)
      at
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719)
      at
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644)
      at
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:560)
      at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
      at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
      at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
      at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
      at
com.nissan.dbs.web.filter.DBSVerifyFilter.doFilter(DBSVerifyFilter.java:208)
      at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
      at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
      at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:206)
      at org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290)
      at
org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:388)
      at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:515)
      at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
      at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
      at
org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
      at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
      at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
      at
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:235)
      at
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
      at
org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:183)
      at
org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:95)
      at
org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.process(SecurityContextEstablishmentValve.java:126)
      at
org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.invoke(SecurityContextEstablishmentValve.java:70)
      at
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
      at
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
      at
org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:158)
      at
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
      at
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:330)
      at
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:829)
      at
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:598)
      at
org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:451)
      at java.lang.Thread.run(Thread.java:619)
 
 
很多使用hibernate的程序员们都会碰到这个异常,这个是异常是因为hibernate的一个bug引起的:在3.3版本的hibernate-core.jar中,该对象没有被序列化,所以会抛出这个异常,用3.6版本的hibernate-core替换掉3.3版本的就可以了。如果是在jboss中,还需要替换掉jboss中common/lib下的hibernate-core.jar包,这样就不会在出现这样的错误了,因为我自己遇到这个问题,查了很久,所以在这里记录一下,希望能对其他的网友们有所帮助:
### Java 中关于 Redisson 的 NotSerializableException 解决方案 `java.io.NotSerializableException` 是一种常见的序列化异常,通常发生在尝试将未实现 `Serializable` 接口的对象进行序列化时。对于 Redisson 中的 `RedissonPermitExpirableSemaphore` 类型对象引发此异常的情况,以下是可能的原因及其解决方案。 #### 原因分析 1. **Redisson 对象本身不可序列化** 如果你在分布式环境中使用 Redisson 提供的功能(如信号量),而这些功能依赖于某些内部状态或上下文数据,则可能会因为这些数据未被标记为可序列化而导致异常[^3]。 2. **嵌套对象未实现 Serializable** 即使 `RedissonPermitExpirableSemaphore` 实现了 `Serializable`,但如果其成员变量中有未实现该接口的对象实例,也会触发 `NotSerializableException` 异常[^5]。 3. **闭包捕获外部变量** 在 Spark 或其他分布式计算框架中,如果通过 lambda 表达式或其他方式传递了一个包含复杂对象图的函数到远程节点执行,那么整个对象树都需要满足序列化条件。任何部分缺失都会导致失败[^4]。 #### 解决方案 为了处理上述问题,可以采取以下措施: 1. **确认目标类是否完全支持序列化** 验证所有涉及的对象都显式声明实现了 `java.io.Serializable` 接口,并且没有任何字段违反这一原则。例如: ```java public class MyCustomClass implements Serializable { private static final long serialVersionUID = 1L; // Ensure all fields are either transient or serializable themselves. private String name; private int age; // Getters and setters omitted for brevity. @Override public String toString() { return "MyCustomClass{" + "name='" + name + '\'' + ", age=" + age + '}'; } } ``` 2. **利用 Transient 关键字忽略特定属性** 若存在无法修改源码或者确实不需要保存的状态信息,可以通过将其定义成 `transient` 来跳过它们的序列化进程[^1]: ```java public class MyClassWithTransientField implements Serializable { private static final long serialVersionUID = 1L; private String importantData; private transient Object nonSerializableObject; // Constructors, getters/setters etc... } ``` 3. **自定义 writeObject 和 readObject 方法** 当默认机制不足以解决问题时,还可以重载这两个特殊方法来自定义行为[^2]: ```java private void writeObject(java.io.ObjectOutputStream out) throws IOException { out.defaultWriteObject(); // Custom serialization logic here if necessary. } private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException { in.defaultReadObject(); // Re-initialize any transient field after deserialization. } ``` 4. **替换为更轻便的数据结构 (推荐用于分布式场景)** 考虑到性能因素以及兼容性需求,在实际开发过程中建议尽可能采用简单的 POJOs 并配合 JSON 序列器比如 Jackson/Gson 进行转换而不是直接操作二进制流。 5. **针对 Redisson 特定情况调整配置** - 使用 RLock/RCountDownLatch 等替代品代替原生锁; - 将业务逻辑拆分至无状态的服务端组件调用而非随任务广播给各个工作节点; --- ### 示例代码片段 假设我们正在调试一个基于 Redisson 的限流模块遇到此类错误,下面是修正后的版本之一: ```java import org.redisson.api.RSemaphoreAsync; import org.redisson.api.RedissonClient; import java.io.Serializable; public class RateLimitedService implements Serializable { private static final long serialVersionUID = 1L; private transient RSemaphoreAsync semaphore; public RateLimitedService(RedissonClient redisson){ this.semaphore = redisson.get SemaphoreAsync("rate_limit_key"); } public boolean tryAcquire(){ return CompletableFuture.supplyAsync(() -> semaphore.tryAcquire()).join(); } } ``` 在此例子中我们将原始类型的引用设为了瞬态 (`transient`) ,从而避免不必要的序列化开销同时也规避掉了潜在的风险点。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值