ObjectInputStream-读取对象-有没有办法防止对无arg超类构造函数的调用?

时间:2019-01-23 01:30:22

标签: java inheritance serializable objectinputstream

我正在使用FileIOStreams和ObjectIOStreams将PreferedCustomer对象写入.dat文件。 我正在练习继承,所以有一个简单的类层次结构。

PreferredCustomer.java从Customer.java继承

Customer.java继承自Person.java。

当我从.dat文件读取我的PreferredCustomer对象时,它将调用Person.java no arg构造函数并将“名称”,“地址”和“电话号码”字段设置为“”。如何防止它调用no arg构造来重置String值?

我将项目托管在github上。 https://github.com/davidmistretta/CustomerObjectDAT

我认为需要重新编写的代码位于Consumers-> src-> CustomerDemo-> StoreConsumerObjects.java第30-> 40行(下面的try / catch语句)

写入对象然后读取对象的主要方法

public static void main(String[] args)
{
    try (FileOutputStream fos = new FileOutputStream("customers.dat");
         ObjectOutputStream oos = new ObjectOutputStream(fos)) {

        PreferredCustomer pc = new PreferredCustomer("David Mistretta","943 Fakedale Way, Funnyvale, MO, 01337","978-000-0000","01A001");
        pc.setBalance(550);
        System.out.println("Object to input into customers.dat\n" + pc.toString() +"\n\n");
        oos.writeObject(pc);
    } catch (IOException e) {
        e.printStackTrace();
    }

    try (FileInputStream fis = new FileInputStream("customers.dat");
         ObjectInputStream ois = new ObjectInputStream(fis)) {

        PreferredCustomer pca = (PreferredCustomer) ois.readObject();
        System.out.println("Object output from customers.dat\n" + pca.toString());
        ois.close();
    } catch (IOException | ClassNotFoundException e) {
        e.printStackTrace();
    } 
} 

我在Person.java中编写的no arg构造函数(第28行-> 34行)

public Person() 
{
    System.out.println("Person no arg construct");
    m_name = "";
    m_phoneNumber = "";
    m_address = "";
}

当前输出

Object to input into customers.dat
Preferred Customer
Name: David Mistretta
Address: 943 Fakedale Way, Funnyvale, MO, 01337
Phone Number: 978-000-0000
Customer Number: 01A001
Mailing List: true
Balance: 550.0
Discount: 0.05


Person no arg construct
Object output from customers.dat
Preferred Customer
Name: 
Address: 
Phone Number: 
Customer Number: 01A001
Mailing List: true
Balance: 550.0
Discount: 0.05

我希望“名称”,“地址”和“电话号码”字段反映输入时的字段。 我按照https://kodejava.org/how-do-i-store-objects-in-file/

上有关如何在文件中存储对象的说明进行操作

如果有人可以向我指出正确的处理方法,将不胜感激。

2 个答案:

答案 0 :(得分:3)

每个非Serializable类的构造函数都必须被调用。 Java语言禁止其他任何内容。 Java序列化机制必须躲避字节码验证以避免构造函数。在某些类中,构造函数可能会执行某种安全性检查。

但是,超类构造函数在Serializable类上的任何东西之前被调用。因此,您的问题可能出在其他地方。

(注意:人们为了破坏自己的喜好而毁灭和重造人们是不赞成的。)

答案 1 :(得分:-1)

因此,我忽略了在Person.java类中添加可序列化的工具。感谢Tom Hawtin告诉我,超类构造函数在Serializable类上的任何东西之前被调用,这导致我发现问题的根源。因此,为了防止从ObjectInputStream读取对象时对超类构造函数进行no arg调用,请确保超类正在使用Serializable接口。如果不是,则将调用no arg构造函数。