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序列化1[实现Serializable接口]

* java默认序列化  * 1.实现Serializable接口(约定)  * 2.序列化和反序列化  * 3.实现java对象和字节序列的转换  * 4.将对象的字节序列(内存)持久化到磁盘(通常...

序列化 serializable demo

  • 2008年01月26日 16:28
  • 841B
  • 下载

javaBean为什么要实现 序列化 Serializable接口?

Java的"对象序列化"能让你将一个实现了Serializable接口的对象转换成一组byte,这样日后要用这个对象时候,你就能把这些byte数据恢复出来,并据此重新构建那个对象了。这一点甚至在跨网络...

Serializable序列化作用

对象的序列化主要有两种用途:   1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;   2) 在网络上传送对象的字节序列。 一. JDK类库中的序列化API   ja...

序列化Serializable的学习笔记

在web应用中,需要将对象等序列化成流,以方便在服务器等之间传输,比如将对象序列化后存入文件中。序列化旧手机将对象转换成一个流,反序列化就是将转换后的流再在堆里重新构建成对象。        如何将...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Serializable: 默认序列化
举报原因:
原因补充:

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