使用transient关键字解决ehcache序列化错误
使用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
使用transient关键字解决ehcache序列化错误的更多相关文章
- 关于Java中的transient关键字
Java中的transient关键字是在序列化时候用的,如果用transient修饰变量,那么该变量不会被序列化. 下面的例子中创建了一个Student类,有三个成员变量:id,name,age.ag ...
- 干了这杯Java之transient关键字
看源码的时候,发现transient这个关键字,不甚理解,查找资料发现:不被序列化 疑问: 静态变量是不是不被序列化? public class User implements Serializabl ...
- 序列化、反序列化和transient关键字的作用
引言 将 Java 对象序列化为二进制文件的 Java 序列化技术是 Java 系列技术中一个较为重要的技术点,在大部分情况下,开发人员只需要了解被序列化的类需要实现 Serializable 接口, ...
- spark出现task不能序列化错误的解决方法
应用场景:使用JavaHiveContext执行SQL之后,希望能得到其字段名及相应的值,但却出现"Caused by: java.io.NotSerializableException: ...
- transient关键字的作用以及几个疑问的解决
目录 1.从Serilizable说到transient 2.序列化属性对象的类需要实现Serilizable接口? 3.不想被序列化的字段怎么办? 4.ArrayList里面的elementData ...
- 序列化,反序列化和transient关键字
一.序列化和反序列化的概念 序列化:指把java对象转换为字节序列的过程. 反序列化:指把字节序列恢复为java对象的过程. 对象的序列化主要有两种用途: 1) 把对象的字节序列保存到硬盘上,通常存放 ...
- Java对象表示方式1:序列化、反序列化和transient关键字的作用
平时我们在Java内存中的对象,是无法进行IO操作或者网络通信的,因为在进行IO操作或者网络通信的时候,人家根本不知道内存中的对象是个什么东西,因此必须将对象以某种方式表示出来,即存储对象中的状态.一 ...
- Java transient关键字序列化时使用小记
1. transient的作用及使用方法 我们都知道一个对象只要实现了Serilizable接口,这个对象就可以被序列化,java的这种序列化模式为开发者提供了很多便利,我们可以不必关系具体序列化的过 ...
- Java 序列化 transient关键字
Java 序列化 transient关键字 @author 敏敏Alexia 转自:http://www.cnblogs.com/lanxuezaipiao/p/3369962.html 1. tra ...
随机推荐
- Sql Server 中使用日期遍历
一个存储过程小案例,内容如下: declare @dt datetime set @dt='2016-01-01' while (@dt<='2016-12-31') begin -- 转换字符 ...
- HDU 1428
漫步校园 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- Java8简明学习之Lambda表达式
函数式接口 就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口,函数式接口可以被隐式转换为lambda表达式. 之前已有的函数式接口: java.lang.Runnable java.uti ...
- 关于DNS缓存
- app判断链接参数后缀跳转不同地址
http://testhf.irongbei.com/DoubleAct/index?from=app <?php $urlp = (isset($_GET['from']) && ...
- 转:xdebug在linux下的安装教程
原文:xdebug在linux下的安装教程 [注意,本人是PHP7.1.7 Nginx ,第7步没有做,但是xdebug.so就已经在PHP的扩展文件夹里面了.目录是phpinfo的extension ...
- 移动端点击输入框,弹出键盘,底部被顶起问题(vue)
这个问题相信做移动端开发的童鞋会有深刻体会,以前用jq开发时就很头疼这个问题,每次底部footer部分需要用position:fixed,如果页面内容不是很长,没有超出屏幕范围,那就还好,没有问题:一 ...
- opencv3.2.0图像处理之中值滤波medianBlur API函数
/*中值滤波:medianBlur函数是非线性滤波 函数原型:void medianBlur(inputArray src,OutputArray dst,int ksize) 参数详解: input ...
- AE中IHookHelper的用法 来自http://blog.sina.com.cn/s/blog_6faf711d0100xs1x.html
IHookHelper 主要在用在自定义类型于AE带的的ICommand或ITool等, 1.实例化IHookHelper 对象: IHookHelper m_hookHelper = new Hoo ...
- JSON学习笔记-5
JSON.parse() 1.从服务器接受数据进行解析(一般是字符串) 2.解析前要确保你的数据是标准的 JSON 格式,否则会解析出错.可以使用线工具检测:https://c.runoob.com/ ...