Serializable: 默认序列化

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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值