`
flowercat
  • 浏览: 358683 次
社区版块
存档分类
最新评论

内部类的序列化问题

阅读更多
   存储到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异常。
后查找资料,发现内部类改成静态内部类后,序列化成功。
这是咋会事情呢?静态内部类和非静态内部类在序列化过程中有什么不同呢?
分享到:
评论
5 楼 Morgan0916 2006-11-09  
You are welcome!
4 楼 flowercat 2006-11-09  
非静态内部类对外部类实例的引用可以使用SerializableInnerClassTest.this
3 楼 flowercat 2006-11-09  
谢谢楼上的,看来还是对内部类的理解不够!
2 楼 Morgan0916 2006-11-09  
我觉得这要从静态内部类和非静态内部类与外部类的关系上来考虑.

非静态内部类拥有对外部类的所有成员的完全访问权限,包括实例字段和方法。为实现这一行为,非静态内部类存储着对外部类的实例的一个隐式引用。序列化时要求所有的成员变量是Serializable,你现在SerializableInnerClassTest并没有implements Serializable,所以就抛出java.io.NotSerializableException异常!这样就是可以的!
public class SerializableInnerClassTest extends TestCase implements Serializable


非静态内部类和外部类没有那样的引用关系,自然也不会出那样的问题!
1 楼 karna 2006-11-09  
把Person定义为static

相关推荐

Global site tag (gtag.js) - Google Analytics