反序列化对象列表

时间:2014-02-23 10:42:05

标签: java serialization

我有一个文件,我需要使用相同类型的多个对象进行反序列化。

public static ArrayList<Dog> readDogs() {
    ArrayList<Dogs> dogs = null;
    ObjectInputStream in = null;

    try {
        in = new ObjectInputStream(new BufferedInputStream(new FileInputStream(filename)));
        dogs = new ArrayList<Dog>();

        while(true) {
            dogs.add((Dog) in.readObject());
        }
    } catch (EOFException e) {

    } catch (Exception e) {
        System.err.println(e.toString());   
    } finally {
        try {
            in.close();
        } catch (IOException e) {
            System.err.println(e.toString());   
        }
    }
    return dogs;
}

使用当前的实现,我依靠try子句来捕获并忽略文件结尾异常,这看起来很丑陋,但我不确定如何处理它?<​​/ p>

4 个答案:

答案 0 :(得分:1)

不要序列化/反序列化每只狗。序列化/反序列化狗的单个列表

所有列表实现本身都是Serializable,序列化它们会自动序列化其所有元素。

答案 1 :(得分:0)

EOFEception表示由代码之外的内容引起的异常情况。如果您没有捕获代表您可以在代码中修复的某个错误的ErrorRuntimeException,那么使用Exception 的最佳方式处理问题。

如果问题不在您的代码中,这是正确的,但在它之外(网络已关闭,文件未找到,文件已损坏),则可以通常建议使用异常处理问题。

在某些情况下,您应该在使用之前验证数据。如果以不正确的格式(例如:用户输入)接收数据的可能性很大,则首先验证它可能更有效。但是在极少数情况下,您可能会有数千个损坏的文件,最好在异常发生时捕获它并处理它。

您可以改进记录异常的代码,以便稍后跟踪它们。您还应该考虑哪个类应该负责处理异常(如果它应该捕获并修复问题,或者它应该声明throws并将其传播给调用者。

答案 2 :(得分:0)

在阅读下一只狗之前,使用InputStream.available()来测试数据是否在流中可用。

答案 3 :(得分:0)

以下代码应该有效:

    try {
        FileInputStream fin = new FileInputStream(filename);
        in = new ObjectInputStream(new BufferedInputStream(fin));
        dogs = new ArrayList<Dog>();
        while (fin.available() > 0) {
            dogs.add((Dog) in.readObject());
        }
    } catch (EOFException e) {

请注意,您应该在available()对象上调用FileInputStream,而不是ObjectInputStream对象,它不能正确支持它。另请注意,您仍然应该捕获并处理EOFException,因为在特殊情况下它可能仍会被引发。