gpt4 book ai didi

Java readObject 和继承的转换

转载 作者:行者123 更新时间:2023-12-02 11:08:19 27 4
gpt4 key购买 nike

这是我的第一个问题,因为到目前为止我总是能找到我需要的东西,但这次一些相对基本的东西让我发疯。所以我有这个类(class):

public class QImage {
protected String imagePath;

public QImage() {

}

public QImage(String imgPath) {
imagePath = imgPath;
}

并且比:

public class DImage extends QImage implements Serializable {
protected int imageId;

public DImage(String imagePath) {
imageId = 0;
}

稍后在代码中:

private void saveData(String filePath, List<DImage> imap) {
try {

FileOutputStream fileImap = new FileOutputStream(filePath);
ObjectOutputStream objectImap = new ObjectOutputStream(fileImap);

for (DImage image : imap) {
objectImap.writeObject(image);
}

此时一切似乎都很好,直到:

public List<DImage> loadData(String filePath) {

List<DImage> imap = new ArrayList<>();

try {
FileInputStream fileImap = new FileInputStream(new File(filePath+"_imap.dat"));
ObjectInputStream objectImap = new ObjectInputStream(fileImap);

while (true) {
try {
**imap.add((DImage) objectImap.readObject());**
} catch (EOFException e) {
break;
}
}

我收到 String imagePath=null。我确信这是关于构造函数和将 readObject 转换为 DImage 的问题,但我不知道如何应对。如果我在 DImage 中创建另一个不是从 QImage 继承的字符串,则一切正常。

编辑:

所以我简单地称之为:

    Desc desc = new Desc();
List<DImage> imagesList = desc.loadData("C:\\collective.xml");

问题是,默认构造函数在以下情况下被调用:

imap.add((DImage) objectImap.readObject());

最佳答案

您将得到 imagePath==null,因为设置此字段的构造函数 QImage(String) 永远不会由类 DImage 执行:

public class DImage extends QImage implements Serializable {
protected int imageId;

public DImage(String imagePath) {
super(imagePath); // <-- you have to call the constructor
imageId = 0;
}

编辑:此外,您必须使您的类QImage实现Serialized,因为只有实现此接口(interface)的类的字段才会被保存/恢复(刚刚验证)。

关于Java readObject 和继承的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50766351/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com