【问题标题】:A problem with Serializable and ArrayStoreExceptionSerializable 和 ArrayStoreException 的问题
【发布时间】:2021-02-28 01:14:43
【问题描述】:

假设我有三个类: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 加载到一个数组中。关于如何做到这一点的任何想法?

【问题讨论】:

    标签: java serializable arraystoreexception


    【解决方案1】:

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

    【讨论】:

    • ...非常简单且非常有效。感谢您的帮助
    猜你喜欢
    • 2011-07-13
    • 1970-01-01
    • 2011-10-11
    • 2016-03-21
    • 2010-12-05
    • 2012-12-26
    • 2012-09-04
    • 1970-01-01
    • 2011-09-20
    相关资源
    最近更新 更多