java - 一旦方法返回,传递给方法并反序列化的列表将变为空

标签 java generics serialization collections

我有一个方法:

static <E extends NotesAttached> void deserialise(List<E> list, String type) {
    String fileName = "C:/temp/SalesModel." + type + ".list.ser";
    try {
        FileInputStream serFile = new FileInputStream(fileName);
        ObjectInputStream in = new ObjectInputStream(serFile);
        list = (List<E>) in.readObject();
        in.close();
        serFile.close();
        System.out.println(type + "s deserialised successfully, " + list.size() + " retrieved");
    } catch (IOException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
}

我这样调用它:

    List<Deal> deals = new ArrayList<Deal>();
    deserialise(deals, "Deal");
    System.out.println("Number of deals deserialised: " + deals.size());

列表在方法中时会被填充,但当它返回时,它是空的。我不明白为什么,如果有人能解释一下,我将不胜感激。

输出如下:

交易反序列化成功,检索到 2522 条交易 反序列化交易数量:0

最佳答案

您反序列化的列表不会“变空” - 但 deals 变量并不引用您刚刚反序列化的列表...它引用同一个空列表它在您调用该方法之前执行的操作。更改方法中 list 参数的值对您传递的参数没有任何作用,因为 Java 使用按值传递。

与其使用 void 方法,不如返回列表:

static <E extends NotesAttached> List<E> deserialise(String type)
        throws IOException, ClassNotFoundException {
    String fileName = "C:/temp/SalesModel." + type + ".list.ser";
    FileInputStream serFile = new FileInputStream(fileName);
    ObjectInputStream in = new ObjectInputStream(serFile);
    try {
        List<E> list = (List<E>) in.readObject();
        System.out.println(type + "s deserialised successfully, " + list.size() + " retrieved");
        return list;
    } finally {
        // See notes
        in.close();
        serFile.close();
    }
}

并用以下方式调用它:

List<Deal> deals = deserialise(deals, "Deal");
System.out.println("Number of deals deserialised: " + deals.size());

您需要处理 ClassNotFoundExceptionIOException,但无论如何,最好在方法外部处理它们 - 几乎可以肯定不想仅仅捕获它们,转储堆栈跟踪并继续,就好像没有发生任何问题一样。

这不太正确,因为您确实希望关闭流,而不管其他错误如何。如果您可以使用 Java 7,则可以改用 try-with-resources 语句:

static <E extends NotesAttached> List<E> deserialise(String type)
        throws IOException, ClassNotFoundException {
    String fileName = "C:/temp/SalesModel." + type + ".list.ser";
    try (FileInputStream serFile = new FileInputStream(fileName),
         ObjectInputStream in = new ObjectInputStream(serFile)) {
        List<E> list = (List<E>) in.readObject();
        System.out.println(type + "s deserialised successfully, " + list.size() + " retrieved");
        return list;
    }
}

如果您坚持使用 Java 6,我可能会使用嵌套的 try/finally block - 或者关闭 FileInputStream,因为 ObjectInputStream 无论如何都不会保留任何非托管资源。

关于java - 一旦方法返回,传递给方法并反序列化的列表将变为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21099645/

相关文章:

java - 关闭用于在 Java/Tomcat 中写入的 HTTP session

java - java generic编译时错误背后的解释?

swift - 如何为不同类型定义通用“无效”值

带状态的 Java Streams - 一个简单的练习

java - JSP Servlet session invalidate() 不会使 session 为空

java - 如何将变量传递给通知?

java - 为什么 java.lang.reflect.WildcardType 类返回上限和下限的数组?

perl - 如何将 Moose 对象转换为 JSON 以在 Catalyst 中使用?

ruby-on-rails - Rails : NameError (uninitialized constant UserSerializer)

java - JSON反序列化失败? (servlet->applet 通信)