Serializable 和 ArrayStoreException 的问题

A problem with Serializable and ArrayStoreException

假设我有三个 classes:SerClassSerClassASerClassBSerClass 是抽象的,另外两个 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() 时,后者会创建一个存储 或者 SerClassASerClassB,具体取决于 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()]);
}