【发布时间】:2021-02-28 01:14:43
【问题描述】:
假设我有三个类:SerClass、SerClassA 和 SerClassB。 SerClass 是抽象的,另外两个类是它的非抽象子类。它们都实现了Serializable 接口。
由于这些类实现了Serializable 接口,我可以将它们写在文件上。让我们再次假设在特定的directory 中有许多文件,每个文件都存储一个SerClass 对象。如果我想将它们加载回来,我会写如下内容:
public static SerClass[] loadArray(File directory) {
Vector<SerClass> support = new Vector<SerClass>();
for( File file : directory.listFiles() )
support.add(loadObject(file));
return convert(support);
}
// Utility methods
public static <T> T[] convert(Vector<T> v) {
if( v.size() == 0 ) return null;
T example = null;
for(T element : v)
if( element != null ) { example = element; break; }
@SuppressWarnings("unchecked")
T[] output = (T[]) Array.newInstance(example.getClass(), v.size());
for(int i=0 ; i<output.length; i++) output[i] = v.get(i);
return output;
}
public static <T extends Serializable> T loadObject(File file) {
T output = null;
ObjectInputStream objectStream = null;
try { objectStream = new ObjectInputStream(new FileInputStream(file));
} catch (FileNotFoundException e) { e.printStackTrace(); }
catch (SecurityException e) { e.printStackTrace(); }
catch (StreamCorruptedException e) { e.printStackTrace(); }
catch (NullPointerException e) { e.printStackTrace(); }
catch (IOException e) { e.printStackTrace(); }
try { output = (T) objectStream.readObject();
} catch (ClassNotFoundException e) { e.printStackTrace(); }
catch (InvalidClassException e) { e.printStackTrace(); }
catch (StreamCorruptedException e) { e.printStackTrace(); }
catch (OptionalDataException e) { e.printStackTrace(); }
catch (IOException e) { e.printStackTrace(); }
try { objectStream.close();
} catch (IOException e) { e.printStackTrace(); }
return output;
}
我检查了实用程序方法,它们可以正常工作。然而,loadArray() 方法会导致 java.lang.ArrayStoreException:当它将Vector 传递给convert() 方法时,后者会创建一个存储SerClassA 或SerClassB 的数组,取决于找到的第一个非null 元素来自哪个类。
我需要将两种类型的SerClass 加载到一个数组中。关于如何做到这一点的任何想法?
【问题讨论】:
标签: java serializable arraystoreexception