Java readObject和继承转换

时间:2018-06-08 18:16:05

标签: java inheritance constructor casting

这是我在这里的第一个问题,因为直到现在我总能找到我需要的东西,但这次相对基本的东西让我发疯。所以我有这个课程:

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

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

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

我得到String imagePath = null。我确定它是关于构造函数并将readObject转换为DImage的东西,但我不知道如何应对它。如果我在DImage中创建另一个String,它不是从QImage继承的,那么一切正常。

编辑:

所以我简单地称之为:

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

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

line_reader.js

1 个答案:

答案 0 :(得分:1)

您收到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实施Serializable,因为只保存/恢复实施此界面的类字段(刚验证过)。