Serializable 和 ArrayStoreException 的问题
A problem with Serializable and ArrayStoreException
假设我有三个 classes:SerClass
、SerClassA
和 SerClassB
。 SerClass
是抽象的,另外两个 class 是它的非抽象子 class。它们都实现了 Serializable
接口。
由于那些 class 实现了 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
,具体取决于 class 是找到的第一个非 null
元素。
我需要在一个数组中加载两种类型的 SerClass
。关于如何做的任何想法?
使用 Vector
class 的 toArray
方法代替您的转换方法:
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()]);
}
假设我有三个 classes:SerClass
、SerClassA
和 SerClassB
。 SerClass
是抽象的,另外两个 class 是它的非抽象子 class。它们都实现了 Serializable
接口。
由于那些 class 实现了 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
,具体取决于 class 是找到的第一个非 null
元素。
我需要在一个数组中加载两种类型的 SerClass
。关于如何做的任何想法?
使用 Vector
class 的 toArray
方法代替您的转换方法:
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()]);
}