Serializable:writeReplace

原创 2015年07月08日 14:24:42

如果一个序列化类中含有Object writeReplace()方法,那么实际序列化的对象将是作为writeReplace方法返回值的对象,而且序列化过程的依据是实际被序列化对象的序列化实现。

People定义了writeReplace方法,并且自定义了writeObject/readObject方法。

public class People implements Serializable
{
    /**
     * 
     */
    private static final long serialVersionUID = 2659082826995480601L;
    private int age;
    private String name;

    People(int age,String name)
    {
        this.age = age;
        this.name = name;
    }

    private void writeObject(ObjectOutputStream out)
    {
        System.out.println("是否调用了我?");
    }
    private void readObject(ObjectInputStream in)
    {
        System.out.println("是否调用了我?");
    }   

    private Object writeReplace()
    {
        return new Kong("路人");
    }

}

作为People类writeReplace返回值的Kong对象

public class Kong implements Serializable
{
    /**
     * 
     */
    private static final long serialVersionUID = -7144694309484327560L;

    public String s;

    Kong(String s)
    {
        this.s = s;
    }

    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("入");
    }
}

测试程序:

@Test
    public void testOut03() throws FileNotFoundException, IOException
    {
        People p = new People(2,"小白");
        ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("D:\\temp01.txt"));
        out.writeObject(p);
        out.flush();
        out.close();
    }

    @Test
    public void testIn03() throws FileNotFoundException, IOException, ClassNotFoundException
    {
        ObjectInputStream in = new ObjectInputStream(new FileInputStream("D:\\temp01.txt"));
        Kong k = (Kong)in.readObject();
        in.close();
        System.out.println(k.s);
    }

可以看到out.writeObject(p);试图序列化一个People对象,但是由于writeReplace方法的存在,实际上序列化了一个Kong 对象,在这个过程中调用了Kong定义的writeObject方法,并且在反序列化过程中,得到了一个Kong对象,并且调用了Kong定义的readObject方法。整个过程与People的writeObject/readObject无关。

这也就是说Kong k = (Kong)in.readObject();这个过程会依赖in中的实际对象,而不是依赖out.writeObject(p);

不知道为什么,就是这么个实现。

[疯狂Java]I/O:其它自定义序列化的方法(transient、writeReplace、readResolve、Externalizable)

1. 一种不是很好的排除序列化——transient关键字:     1) 如果你不想让对象中的某个成员被序列化可以在定义它的时候加上transient关键字进行修饰,例如: class A impl...

序列化之writeReplace方法应用

  • 2015年08月23日 10:53
  • 54KB
  • 下载

Serializable序列化

  • 2014年04月27日 21:57
  • 26KB
  • 下载

Serializable与Parcelable的使用方法及区别

一、Serializable接口 Serializable接口是Java所提供的一个序列化接口,它是一个空接口,为对象提供标准的序列化和反序列化操作。使用Serializable来实现序列化相当简单,...

bundle传递对象与Serializable、Parcelable接口理解和思考

bundle.putSerializable 或者 bundle.putParcelable 传进去的对象一定要implements Parcelable 或者 Serializable 这两个接口。...

android 序列化与反序列化总结(Serializable和Parcelable)

序列化是指将对象的状态信息转换为可以存储或传输的形式的过程。在Java中创建的对象,只要没有被回收就可以被复用,但是,创建的这些对象都是存在于JVM的堆内存中,JVM处于运行状态时候,这些对象可以复用...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Serializable:writeReplace
举报原因:
原因补充:

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