子类是Serializable超类不可序列化

时间:2013-11-15 00:27:30

标签: java serialization

我刚开始讨论这个话题。我的理解是说,如果你想保存一个类的实例变量,以便以后可以使用...你可以使用“serializable”接口,没有定义方法...... 但我怀疑,继承中会发生什么...假设我的超类不是序列化的子类被序列化...我可以保存我的超类实例变量吗? 虽然,我知道这一点......超级类的构造函数正在被调用,但它会运行......但是dat意味着什么?这是否意味着,我无法保存超类的实例变量....

在下面的程序中...创建的文件将存储数值(43,43)或只是变量“height”和“weight”???

import java.io.*;

class A  {

String sex;

public void gone(String sex){

this.sex = sex;

System.out.println("i m " + sex); 

}

}


public class serialio1 extends A implements Serializable  {

int height;

int weight;

public static void main(String[] args){

serialio1 myBox = new serialio1();

myBox.go(43,23);

try{

FileOutputStream fs = new FileOutputStream("foo.ser");

ObjectOutputStream os = new ObjectOutputStream(fs);

os.writeObject(myBox);

os.close();

FileInputStream fileStream = new FileInputStream("foo.ser");

ObjectInputStream ms = new ObjectInputStream(fileStream);

Object one = ms.readObject();

Object two = ms.readObject();

int h = (int) one;

int  w = (int) two;

ms.close();

System.out.println("saved values" + h + w);

} catch(Exception ex){

ex.printStackTrace();

}

}

public void go(int height , int weight) {

this.height = height;

this.weight = weight;

System.out.println(" height is " + height);

System.out.println(" weight is " + weight);

}

}

2 个答案:

答案 0 :(得分:1)

如果您可以从子类访问超类字段,则可以实现自定义序列化

class X {
    int x;
}

class Y extends X implements java.io.Serializable {

    private void writeObject(ObjectOutputStream out) throws IOException {
        out.defaultWriteObject();
        out.writeInt(x);
    }

    private void readObject(ObjectInputStream in) throws IOException,
            ClassNotFoundException {
        in.defaultReadObject();
        x = in.readInt();
    }

}

答案 1 :(得分:1)

  

假设我的超类没有序列化,那么子类被序列化...我可以保存我的超类实例变量吗?

是的,但您必须编写额外的代码,如Evgeny的回答所示。

  

虽然,我知道这一点......超级类的costructor正在调用它会运行......但是dat意味着什么?这是否意味着,我无法保存超类的实例变量....

我真的无法理解这一点,但如果你只是重复你之前的问题,答案也是一样的。

  

在下面的程序中...创建的文件将存储数值(43,43)或只是变量“height”和“weight”???

我也无法理解这一点。这不是问题。它将存储您传递给writeObject(),对象,这将是您从readObject().返回的内容。在您的情况下,是serialio1对象,而不是整数。