浏览 3097 次
|
锁定老贴子 主题:内部类的序列化问题
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
|---|---|
| 作者 | 正文 |
|
最后更新时间:2006-11-09 关键字: 序列化
存储到memcached的所有对象都必须实现Serializable接口。今天修改系统缓存实现,从系统内部的Cache转到memcached。在转换过程中出现了内部类因为不能序列化导致设置缓存失败。写了以下的测试代码测试内部类的序列化:
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import junit.framework.TestCase;
public class SerializableInnerClassTest extends TestCase
{
class Person implements Serializable{
String name;
String password;
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public String getPassword()
{
return password;
}
public void setPassword(String password)
{
this.password = password;
}
}
public void testSerializable(){
ByteArrayOutputStream out = new ByteArrayOutputStream();
ObjectOutputStream oos;
try
{
oos = new ObjectOutputStream(out);
oos.writeObject(new Person());
oos.close();
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
assertTrue(out.toByteArray().length > 0);
}
}
这个测试跑的话将会抛出java.io.NotSerializableException异常。 后查找资料,发现内部类改成静态内部类后,序列化成功。 这是咋会事情呢?静态内部类和非静态内部类在序列化过程中有什么不同呢? 声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
最后更新时间:2006-11-09
把Person定义为static
|
|
| 返回顶楼 | |
|
最后更新时间:2006-11-09
我觉得这要从静态内部类和非静态内部类与外部类的关系上来考虑.
非静态内部类拥有对外部类的所有成员的完全访问权限,包括实例字段和方法。为实现这一行为,非静态内部类存储着对外部类的实例的一个隐式引用。序列化时要求所有的成员变量是Serializable,你现在SerializableInnerClassTest并没有implements Serializable,所以就抛出java.io.NotSerializableException异常!这样就是可以的! public class SerializableInnerClassTest extends TestCase implements Serializable 非静态内部类和外部类没有那样的引用关系,自然也不会出那样的问题! |
|
| 返回顶楼 | |
|
最后更新时间:2006-11-09
谢谢楼上的,看来还是对内部类的理解不够!
|
|
| 返回顶楼 | |
|
最后更新时间:2006-11-09
非静态内部类对外部类实例的引用可以使用SerializableInnerClassTest.this
|
|
| 返回顶楼 | |
|
最后更新时间:2006-11-09
You are welcome!
|
|
| 返回顶楼 | |






