Serializable:序列化代理

原创 2015年07月08日 14:40:06

序列化代理简单来说,A有序列化的需求,但是不直接序列化A,而是序列化一个A的代理对象B,我们可以将A的信息保存在B中,在反序列化时,再通过B得到A的信息,实例化一个A对象
为什么这么费劲呢?因为反序列化是java机制之外的东西,不通过构造方法生成实例,这样有机会被入侵(具体说不上,就是有可能被黑的意思吧),采用序列化代理可以有效的避免通过反序列化来生成实例,所有的实例都通过构造函数来生成,这样就可以保证所有的实例都遵守构造函数的约束。
具体实现呢 通过例子来说吧:

public class Dog implements Serializable
{
    /**
     * 
     */
    private static final long serialVersionUID = 2599175554577989702L;


    private String name;
    private int age;

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    private static class SerializationProxy implements Serializable
    {

        /**
         * 
         */
        private static final long serialVersionUID = -1792022185138959673L;

        private String name;
        private int age;

        SerializationProxy(Dog dog)
        {
            this.name = dog.name;
            this.age = dog.age;
        }



        private Object readResolve()
        {
            return new Dog(name,age);
        }

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

    private Object writeReplace()
    {
        return new SerializationProxy(this);
    }

    private void readObject(ObjectInputStream in) throws Exception
    {
        throw new Exception("proxy required");
    }
}

定义了一个内部类,SerializationProxy 作为Dog 的序列化代理
如果试图序列化一个Dog,由于Dog中定义了

private Object writeReplace()
{
    return new SerializationProxy(this);
}

则实际会序列化一个Dog的序列化代理,而这个序列化代理是通过Dog对象来构造的(保存了Dog的信息),上节说到,之后的过程都会依赖实际被序列化类的序列化实现,也就是会依赖于Dog序列化代理的序列化实现,反序列化Dog序列化代理时由于

private Object readResolve()
{
    return new Dog(name,age);
}

实际会返回一个Dog对象,这样原来保存的Dog信息又回来了,而且新的Dog实例是通过构造方法生成的。

如何使用呢,其实完全看不出来,正常用就行了

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

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

用法呢其实都是相同的,关键是序列化类wirteObject和readObject的实现。

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

相关文章推荐

Effective Java 读书笔记(八):异常

只针对异常情况才使用异常 对于可恢复的情况使用受检异常对于编程错误使用运行时异常 避免不必要地使用受检异常 优先使用标准的异常 抛出与抽象相对应的异常 每个方法抛出的异常都要有文档 在细节消息中包含造...

Serializable接口基本理解(3)--序列化代理的使用

Effective Java一书一直在强调,你的类实现Serializable接口前,一定要进行价值评估,是否值得这么做,尤其你的类是一个需要进行大量继承扩展的类。因为实现了Serializable接...

Serializable接口基本理解--序列化代理的使用

Effective Java一书一直在强调,你的类实现Serializable接口前,一定要进行价值评估,是否值得这么做,尤其你的类是一个需要进行大量继承扩展的类。因为实现了Serializable接...

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...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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