Java readObject и приведение с наследованием - PullRequest
0 голосов
/ 08 июня 2018

это мой первый вопрос здесь, так как до сих пор я всегда находил то, что мне нужно, но на этот раз что-то относительно базовое сводит меня с ума.Итак, у меня есть этот класс:

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());

1 Ответ

0 голосов
/ 08 июня 2018

Вы получаете 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, потому что только поля классов, которые реализуют этот интерфейс, сохраняются / восстанавливаются (только что проверены).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...