浏览 10979 次
锁定老帖子 主题:内部类的序列化问题
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2006-11-09
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异常。 后查找资料,发现内部类改成静态内部类后,序列化成功。 这是咋会事情呢?静态内部类和非静态内部类在序列化过程中有什么不同呢? 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间: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!
|
|
返回顶楼 | |