假设我有三个班: 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
在单个数组中。有什么办法吗?
1条答案
按热度按时间o75abkj41#
使用
toArray
方法Vector
类而不是convert方法: