这是我在这里的第一个问题,因为到目前为止,我一直都能找到我需要的东西,但这一次,一些相对基础的东西让我发疯。所以我有这样一个类:
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有关,但我不知道如何处理这些问题。如果我在不是从QImage继承的DImage中创建另一个字符串,一切都会正常工作。
编辑:
所以我简单地叫它:
Desc desc = new Desc();
List<DImage> imagesList = desc.loadData("C:\\collective.xml");
问题是,默认构造函数在以下情况下被调用:
imap.add((DImage) objectImap.readObject());
发布于 2018-06-09 02:32:09
您将获得imagePath==null
,因为类DImage
从未执行过设置此字段的构造函数QImage(String)
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
,因为只有实现此接口的类的字段才会被保存/恢复(只是验证)。
https://stackoverflow.com/questions/50766351
复制相似问题