使用transient关键字解决ehcache序列化错误

简介: 使用Ehcache时发现个不起眼的小问题 在一个Model中有以下代码: public class MyModel implements Serializable { private static final long serialVersionUID = -990334519...

使用Ehcache时发现个不起眼的小问题

在一个Model中有以下代码:

public class MyModel implements Serializable {

    private static final long serialVersionUID = -990334519496260591L;

    private IUserService us = ServiceManager.me.getUserService();

    //getter and setter

}

在将这个Model的一个实例缓存到Ehcache时,如果恰好Ehcache配置了允许保存到磁盘,那么就会提示错误:

ERROR DiskStorageFactory   Disk Write of xxxxxxx failed:
java.io.NotSerializableException: com.my.service.impl.UserServiceImpl$$EnhancerByGuice$$80ede2b6

看错误提示,很明显是 UserServiceImpl 对象无法序列化,原来是Ehcache把这个服务逻辑也看成了Model的普通属性

正常情况下,将 UserServiceImpl 实现 Serializable 接口就可以解决问题

但实际上,这个服务是无状态的单列模式,将它序列化到磁盘是没有任何意义的,还会增加磁盘的IO开销

那怎么样才能将Model成功缓存,又能刨除这些服务逻辑的属性呢?

 

这时候,一个不起眼的关键字发挥了作用:transient

将上面的代码改成如下,其实只是增加了这个关键字而已:

public class MyModel implements Serializable {

    private static final long serialVersionUID = -990334519496260591L;

    private transient IUserService us = ServiceManager.me.getUserService();

    //getter and setter

}

再次缓存时,将不会提示错误。

这里有一篇文章对 transient 关键字进行了更详细的阐述:https://www.cnblogs.com/lanxuezaipiao/p/3369962.html


宠辱不惊,看庭前花开花落;去留无意,望天上云卷云舒
目录
相关文章
|
6月前
|
缓存 NoSQL fastjson
Shiro Session集群共享存入Redis中SimpleSession的transient 属性不能序列化
Shiro Session集群共享存入Redis中SimpleSession的transient 属性不能序列化
|
Java 开发者
【第 13 个代码模型】对象序列化(transient 关键字)|学习笔记
快速学习 【第 13 个代码模型】对象序列化(transient 关键字)
transient:将属性脱离序列化 | 带你学《Java语言高级特性》之七十一
transient关键字是类似于static、final等关键字的修饰符,它可以使类中的属性在序列化时跳过该属性,本节将为读者介绍其相关内容与用法。
|
Java
java 序列化transient 关键字使用
先解释下什么是序列化 我们的对象并不只是存在内存中,还需要传输网络,或者保存起来下次再加载出来用,所以需要Java序列化技术。 Java序列化技术正是将对象转变成一串由二进制字节组成的数组,可以通过将二进制数据保存到磁盘或者传输网络,磁盘或者网络接收者可以在对象的属类的模板上来反序列化类的对象,达到对象持久化的目的。
1920 0
|
存储 安全 Java
Java IO--对象序列化Serializable、ObjectOutputStream、ObjectInputStream、transient
<h1>1、对象序列化是什么?</h1> <div>一个对象产生之后实际上是在内存中为其开辟了一个存储空间,方便存储信息。<br> </div> <div> <img src="http://img.blog.csdn.net/20131118084016015" alt=""><br> </div> <h1>定义可序列化的类:</h1> <div> <pre name="code
1468 0
|
XML C# 数据格式
“default关键字”与“序列化传输”的注意事项
注:此乃“流水帐”式的水文,营养成分较低,高手请自动无视以下内容,否则引起消化不良等症状等,一概不管 ^_^   c#自从3.0开始,提供了很多便捷的语法特性(俗称“语法糖”),以简化程序员的工作量,同时也让编程变得更有乐趣,但是凡事有利必有弊。
818 0
|
Java
java Transient在序列化时不保存该值
package com.jshow.arithmetic.interview; import java.io.FileInputStream; import java.
736 0
|
2月前
|
存储 XML JSON
数据传输的艺术:深入探讨序列化与反序列化
数据传输的艺术:深入探讨序列化与反序列化
61 0
|
1月前
|
JSON 安全 Java
Spring Boot 序列化、反序列化
本文介绍了Spring Boot中的序列化和反序列化。Java提供默认序列化机制,通过实现Serializable接口实现对象到字节流的转换。Spring Boot默认使用Jackson处理JSON,可通过注解和配置自定义规则。然而,序列化可能引发安全问题,建议使用白名单、数据校验和安全库。最佳实践包括使用标准机制、自定义规则及注意版本控制。文章还提醒关注性能并提供了相关参考资料。
47 2