2

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

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

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);

}

}
4

2 回答 2

1

假设我的超类未序列化而子类已序列化...我可以保存我的超类实例变量吗?

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

虽然,我知道这一点......超类的构造函数被调用并且它将运行......但是这是什么意思?这是否意味着,我无法保存超类的实例变量......

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

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

我也想不通。这是一个非问题。它将存储您传递给的对象writeObject(),,这就是您将从中得到的对象。readObject().在您的情况下,是一个serialio1对象,而不是整数。

于 2013-11-15T02:17:38.737 回答
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();
    }

}
于 2013-11-15T01:01:00.300 回答