java - Serializable 和 ArrayStoreException 的问题
问题描述
假设我有三个类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
在一个数组中加载这两种类型。关于如何做的任何想法?
解决方案
使用类的toArray
方法Vector
而不是您的转换方法:
public static SerClass[] loadArray(File directory) {
Vector<SerClass> support = new Vector<SerClass>();
for( File file : directory.listFiles() )
support.add(loadObject(file));
return support.toArray(new SerClass[support.size()]);
}
推荐阅读
- reactjs - 将初始值绑定到材质 ui 选择
- r - 在选择函数中将不带引号的参数作为字符传递
- jmeter - 尝试登录时 jmeter 中的 SmackException$NoResponseException
- python - 如何在 OpenCV 中从 Alpha 通道创建遮罩?
- apache-kafka - 如何使用 nodejs 或 java 在 Kafka 流生产者中创建大消息块(1MB 以上)?
- ios - 如何使用 iOS 13 在 iPhone 上启动场景的多个实例?
- java - 使用 mockito 更改 Final 字段
- php - 当 $_SERVER['QUERY_STRING'] 包含 'a=foo' 时,为什么不会填充 $_GET['a']?
- iframe - Mendix iFrame - 找不到页面
- java - 从 Java 中的未知 Groovy 类访问字段