这是我在这里的第一个问题,因为直到现在我总能找到我需要的东西,但这次相对基本的东西让我发疯。所以我有这个课程:
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
答案 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
,因为只保存/恢复实施此界面的类字段(刚验证过)。