serializable和arraystoreexception的问题

jdgnovmf  于 2021-07-08  发布在  Java
关注(0)|答案(1)|浏览(293)

假设我有三个班: 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 在单个数组中。有什么办法吗?

o75abkj4

o75abkj41#

使用 toArray 方法 Vector 类而不是convert方法:

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()]);
}

相关问题