码迷,mamicode.com
首页 > 编程语言 > 详细

Java中的Serializable接口和transient关键字

时间:2015-07-01 11:56:32      阅读:180      评论:0      收藏:0      [点我收藏+]

标签:


Java中的Serializable接口和transient关键字

1 向memcached中放数据时遇到NotSerializableException异常

项目中用到了memcached缓存,存储客户的组织结构,以便提高系统性能。之前系统运行正常,近期为了和Portal对接,更新了涉及到组织结构的jar包(由公司产品部门维护),更新之后发现组织结构不能放到缓存中了,报java.io.NotSerializableException异常。

2 问题排查和解决

经过排查,发现产品部门修改了实体类Orgnization,增加了一个Transaction类成员变量,该变量没有实现Serializable接口,而Memcached要求要存储的对象要实现Serializable接口,所以出现异常。

通过反编译、修改、编译并替换的方式,给Transaction成员变量增加了Serializable接口声明,还是不行,发现在org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper上报java.io.NotSerializableException异常,原来,Transaction类后面一堆数据库操作相关定义,这下就不能通过修改第三方的类来解决问题了。

最终,通过给Transaction类成员变量增加transient解决了该问题。通过该关键字,可以关闭成员变量的串行化。这样,不管后面有多少没有实现Serializable接口的类,都没有关系。而且该关键字只在串行化时起作用,不影响正常的业务处理逻辑。

3 总结

  1. 注意实现Serializable接口和transient关键字的区别和作用
  2. 实体类中实际上不适合包含数据库处理的相关代码(设计问题)
  3. 放缓存时,可以考虑使用自己的实体类,尽量不使用第三方类,以便发生更新变化时造成影响。(设计问题)

Author: galaxy

Created: 2015-07-01 Wed 11:15

Emacs 24.4.1 (Org mode 8.2.10)

Validate

 

Java中的Serializable接口和transient关键字

标签:

原文地址:http://www.cnblogs.com/galaxy-gao/p/4612761.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!