Serializable: 默认序列化

原创 2015年07月08日 09:53:00

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,如果实现的话就会调用。当然这些都是大概的一种推测,目前来看是不准备细究了,以后有必要的话再说。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Serializable序列化

  • 2014-04-27 21:57
  • 26KB
  • 下载

Java 序列化Serializable

1、什么是序列化和反序列化        Serialization(序列化)是一种将对象以一连串的字节描述的过程;反序列化deserialization是一种将这些字节重建成一个对象的过程。2、什么...

序列化 serializable demo

  • 2008-01-26 16:28
  • 841B
  • 下载

对Java Serializable(序列化)的理解和总结

1、序列化是干什么的?        简单说就是为了保存在内存中的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再读出来。虽然你可以用你自己的各种各样的方法来保存object s...

Java 序列化 (Serializable) 的作用

序列化是什么:  序列化就是将一个对象的状态(各个属性量)保存起来,然后在适当的时候再获得。  序列化分为两大部分:序列化和反序列化。 序列化是这个过程的第一部分,将数据分解成字节流...

Java Serializable(序列化)的理解和总结、具体实现过程(转)

原文地址:http://www.apkbus.com/android-13576-1-1.html Java Serializable(序列化)的理解和总结、具体实现过程       ...
  • yhyqf
  • yhyqf
  • 2015-08-11 10:17
  • 1331
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)