首页 > 解决方案 > Serializable 和 ArrayStoreException 的问题

问题描述

假设我有三个类SerClassSerClassASerClassBSerClass是抽象的,另外两个类是它的非抽象子类。它们都实现了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()时,后者会创建一个数组来存储SerClassASerClassB这取决于从哪个类中null找到的第一个非元素。

我需要SerClass在一个数组中加载这两种类型。关于如何做的任何想法?

标签: javaserializablearraystoreexception

解决方案


使用类的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()]);
}

推荐阅读