Java中的Serializable接口和transient关键字

 

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. 放缓存时,可以考虑使用自己的实体类,尽量不使用第三方类,以便发生更新变化时造成影响。(设计问题)

问题:java编译器针对类本身实现了Serializable接口的,但是成员变量没有实现该接口或者没有声明为transient的,为什么不报错或者警告一下呢?

Author: galaxy

Created: 2015-07-02 Thu 16:02

Emacs 24.4.1 (Org mode 8.2.10)

Validate

 

posted @ 2015-07-01 11:18  galaxy-gao  阅读(2644)  评论(0编辑  收藏  举报