0

执行以下代码后,打印的字符串值为 null。为什么?(当然我已经将对象写入文件)。有人可以在这方面帮助我吗?

class Demo {
    protected String name;
    protected String address;
}

class Demo1 extends Demo implements Serializable 
{
    transient int age;
    Demo1(String name,String address,int age)
    {
        this.name=name;
        this.address=address;
        this.age=age;
    }
}
public class FileRead
{
    public static void main(String args[])
    {
        Demo1 ob=new Demo1("Rose","Rohini",23);
        try
        {
            FileInputStream fileIn = new FileInputStream("Demo.ser");
            ObjectInputStream in = new ObjectInputStream(fileIn);
            ob = (Demo1) in.readObject();
            in.close();
            fileIn.close();
        }catch(IOException i)
        {
            i.printStackTrace();
            return;
        }
        catch(ClassNotFoundException c)
        {
            System.out.println("Demo class not found");
            c.printStackTrace();
            return;
        }
        System.out.println("Deserialized Details...");
        System.out.println("Name: " + ob.name);
        System.out.println("Address: " + ob.address);
        System.out.println("age " + ob.age);
    }
}
4

4 回答 4

2

超类Demo不是Serializable。因此,在持久化对象时,不可能持久化超类型的公共、受保护和(如果可访问)包字段Demo1

为了允许序列化不可序列化类的子类型,子类型可以负责保存和恢复超类型的公共、受保护和(如果可访问)包字段的状态。仅当它扩展的类具有可访问的无参数构造函数来初始化类的状态时,子类型才可以承担此责任。

代码更新-

class Demo implements Serializable  {
    protected String name;
    protected String address;
}

在这种情况下,你出去放 -

Rose - Rohini - 0

随着年龄的增长transient,它不会被存储。

于 2013-09-11T07:27:24.103 回答
1

在您的代码中进行以下 3 次更改后,它起作用了。

第一的

class Demo {

改为

class Demo  implements Serializable {

使您的类Demo可序列化,因为您需要对其进行序列化。

下一个

class Demo1 extends Demo implements Serializable {

改为

class Demo1 extends Demo {

无需实现 Serializable ,Demo1因为它扩展Demo了可序列化。

最后,

transient int age;

改为

int age;

transient从年龄中删除,因为字段transient不会被序列化。

PS:如果不是不打算序列化age,顺其自然transient。我给了那个改变,因为你的系统输出中有那个。

于 2013-09-11T07:27:55.563 回答
1

您已将字段声明为“TRANSIENT”。瞬态字段不会被序列化。在重建对象时,它们将具有默认值。对于刺痛,它是空的

粘贴演示类代码后完成更新

修复:您的演示类应该是

class Demo implements Serializable  {
    protected String name;
    protected String address;
}

如果您还希望年龄也被序列化,则更改瞬态整数年龄;--> 整数年龄;

于 2013-09-11T07:12:59.757 回答
0

在这种情况下,使超类“Demo”实现 Serializable。所以,你的代码工作正常。

于 2013-09-12T10:01:43.570 回答