尝试从父级未实现Serializable的子级序列化父级成员变量

时间:2015-11-11 06:55:25

标签: java inheritance serialization

我知道如果父级没有实现Serializable接口,则无法序列化父成员变量。

我已经创建了一个示例程序并试图找到一种方法(无论多么笨拙)序列化父classe的成员变量而不更改它以实现可序列化。

下面是代码:

class s
{ 
    int i;
    public int getI() {
        return i;
    }
    public void setI(int i) {
        this.i = i;
    }
    public int getJ() {
        return j;
    }
    public void setJ(int j) {
        this.j = j;
    }
    int j;
    private int fun(){
         return 1;
     }
}

class m extends s implements Serializable
{
    int k;
    int l;
    public int getK() {
        return k;
    }
    public void setK(int k) {
        this.k = k;
    }
    public int getL() {
        return l;
    }
    public void setL(int l) {
        this.l = l;
    }

    public int fun(){
        return 2;
    }
}

class n1{
    public static void main(String...s)
    {
        m m1  = new m();
        m1.setI(100);
        m1.setJ(101);
        m1.setK(401);
        m1.setL(701);

        try {
            OutputStream os = new FileOutputStream(new File("d:/aaa.data"));
            ObjectOutputStream oos = new ObjectOutputStream(os);
            oos.writeObject(m1);
            InputStream is = new FileInputStream(new File("d:/aaa.data"));
            ObjectInputStream ois = new ObjectInputStream(is);
            m m2 = (m)ois.readObject();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }       
    }
}

我很感激你对这件事的想法,肯定是upvote :) 感谢

2 个答案:

答案 0 :(得分:1)

您可以通过向子类添加以下方法来解决此问题:

  1. 一个.category { position: relative; } .category > img { display: block; } .category-header { background-color: #870000; display: block; color: #FFF; font-family:"Oswald", sans-serif; text-transform: uppercase; padding: 10px 40px; position: absolute; bottom: 0; left: 0; } .category-header h4 { margin: 0px; } 方法,它也序列化了非序列化类的成员。
  2. 反序列化它们的writeObject()方法。
  3. Object Serialization Specification中定义了这些方法所需的签名以及它们可以/必须做的事情。

答案 1 :(得分:0)

回答我自己的问题。

感谢@Ramanlfc了解序列化代理模式。

序列化代理模式对于与此完全相同的条件非常方便;

这是在上面的代码中实现序列化代理模式的代码。

class m extends s implements Serializable {
    int k;
    int l;

    public m() {
    }

    public m(int i, int j, int k, int l) {
        this.i = i;
        this.j = j;
        this.k = k;
        this.l = l;
    }

    private static class MProxy implements Serializable {

        int i;
        int j;
        int k;
        int l;

        public MProxy(m point) {
            this.i = point.getI();
            this.j = point.getJ();
            this.k = point.getK();
            this.l = point.getL();
        }

        private Object readResolve() {
            return new m(i, j, k, l);
        }

    }

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

    public int getK() {
        return k;
    }

    public void setK(int k) {
        this.k = k;
    }

    public int getL() {
        return l;
    }

    public void setL(int l) {
        this.l = l;
    }

    public int fun() {
        return 2;
    }
}

为了实现这种模式,我添加了一个新类MProxy。这是一种包含子类状态副本的容器。

并编写了一个方法writeReplace()来覆盖默认的序列化writeobject行为。它现在返回MProxy而不是this的实例,然后将其写入文件。

这里没有对父类进行任何更改。