论坛首页 Java企业应用论坛

内部类的序列化问题

浏览 10979 次
精华帖 (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异常。
后查找资料,发现内部类改成静态内部类后,序列化成功。
这是咋会事情呢?静态内部类和非静态内部类在序列化过程中有什么不同呢?
   发表时间:2006-11-09  
把Person定义为static
0 请登录后投票
   发表时间:2006-11-09  
我觉得这要从静态内部类和非静态内部类与外部类的关系上来考虑.

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


非静态内部类和外部类没有那样的引用关系,自然也不会出那样的问题!
1 请登录后投票
   发表时间:2006-11-09  
谢谢楼上的,看来还是对内部类的理解不够!
1 请登录后投票
   发表时间:2006-11-09  
非静态内部类对外部类实例的引用可以使用SerializableInnerClassTest.this
0 请登录后投票
   发表时间:2006-11-09  
You are welcome!
1 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics