我正在使用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/
上有关如何在文件中存储对象的说明进行操作如果有人可以向我指出正确的处理方法,将不胜感激。
答案 0 :(得分:3)
每个非Serializable
类的构造函数都必须被调用。 Java语言禁止其他任何内容。 Java序列化机制必须躲避字节码验证以避免构造函数。在某些类中,构造函数可能会执行某种安全性检查。
但是,超类构造函数在Serializable
类上的任何东西之前被调用。因此,您的问题可能出在其他地方。
(注意:人们为了破坏自己的喜好而毁灭和重造人们是不赞成的。)
答案 1 :(得分:-1)
因此,我忽略了在Person.java类中添加可序列化的工具。感谢Tom Hawtin告诉我,超类构造函数在Serializable类上的任何东西之前被调用,这导致我发现问题的根源。因此,为了防止从ObjectInputStream读取对象时对超类构造函数进行no arg调用,请确保超类正在使用Serializable接口。如果不是,则将调用no arg构造函数。