关闭

Serializable: 默认序列化

标签: 默认序列化
218人阅读 评论(0) 收藏 举报
分类:

PeopleName 是一个人名对象,包含三个成员变量:firstName、middleName、lastName,非常适合用默认的序列化形式。

下面说什么是默认序列化形式,默认序列化形式表现上来说就是只要实现Serializable ,任何其它的事情都不需要做了。

public class PeopleName implements Serializable 
{
    private static final long serialVersionUID = -4324501794882864932L;

    private String lastName;
    private String firstName;
    private String middleName;

    PeopleName(String firstName,String middleName,String lastName)
    {
        this.firstName = firstName;
        this.middleName = middleName;
        this.lastName = lastName;
    }

    public String getLastName() {
        return lastName;
    }

    public String getFirstName() {
        return firstName;
    }

    public String getMiddleName() {
        return middleName;
    } 


}

如何使用:

@Test
    public void testOut() throws FileNotFoundException, IOException {
        PeopleName luren01 = new PeopleName("吊","炸","天");
        ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("D:\\temp.txt"));
        out.writeObject(luren01);
        out.flush();
        out.close();
    }
    @Test
    public void testIn() throws FileNotFoundException, IOException, ClassNotFoundException {
        ObjectInputStream in = new ObjectInputStream(new FileInputStream("D:\\temp.txt"));
        PeopleName temp = (PeopleName)in.readObject();
        in.close();
        System.out.println(temp.getFirstName()+"-"+temp.getMiddleName()+"-"+temp.getLastName());
    }

序列化的用法大概就是上面了,将对象以流的形式存储,然后可以从存储的流中还原对象

然后我又在PeopleName中添加了writeObject(ObjectOutputStream out)、readObject(ObjectInputStream in)方法,只是这里我仍然仅仅用out.defaultWriteObject();in.defaultReadObject();来实现序列化,然后加了两个打印语句,

/*private void writeObject(ObjectOutputStream out) throws IOException
    {
        out.defaultWriteObject();
        System.out.println("这里的方法吧?");
    }

    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException
    {
        in.defaultReadObject();
        System.out.println("确实是调用这里的方法!");
    }*/

这样做是为了验证在序列化过程中,在序列化类实现了writeObject/readObject的情况下,是不是会调用这两个方法(其实这已经是自定义序列化的范畴了)
答案是肯定的,确实是调用了这里的方法。
所以过程应该是这样的:
out.writeObject(luren01);/PeopleName temp = (PeopleName)in.readObject();在执行时,程序会检测luren01/in中包含的对象,是否实现writeObject(ObjectOutputStreamout)/readObject(ObjectInputStream in),
如果实现则调用对象的writeObject/readObject方法,这就是自定义序列化。
如果没有实现则使用默认的序列化形式,默认序列化形式使用的就是out.defaultWriteObject();/in.defaultReadObject();,所以上面示例的writeObject/readObject跟默认序列化效果是相同的

至于为什么会在out.writeObject(luren01);/PeopleName temp = (PeopleName)in.readObject();访问到luren01/in中的对象的writeObject/readObject方法,则应该是序列化框架实现的,通过钩子函数、反射等等途径,能够看到要序列化或者反序列化的对象中是实现了writeObject/readObject,如果实现的话就会调用。当然这些都是大概的一种推测,目前来看是不准备细究了,以后有必要的话再说。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场