【问题标题】:Problem understanding Serializable问题理解 Serializable
【发布时间】:2011-10-11 18:59:40
【问题描述】:

刚开始使用 Serializable-thingy,我想保存几个列表和其他一些对象,但我似乎无法正确处理一些事情。

我有一些带有自己的“DefaultListModel”的 JList,我用来对列表中的内容进行排序,我调用了 SortModel 类,当我运行程序时,我这样做:

SortModel sortModel = new SortModel();
JList jList = new JList(sortModel);

然后当程序运行后,根据指定的需要添加和排序对象,现在,当我保存列表并再次加载它们时,它们是空的。

我还保存了一个保存程序背景的类的对象(用户自己选择一个),保存后我需要再次将其添加到程序中(对象,背景存储在其中),我需要再次将其添加到程序中,不仅“按原样”加载它,而且我还有一些对象,我用它们自己的侦听器在该对象上添加了一些对象。在我以某种方式成功加载它之后,对象在那里但我不能使用它们,所以我认为听众没有得到保存?

* 解释编辑 作为程序的类扩展了 JFrame,我认为这没什么好笑的。 “背景对象”(称为地图)扩展了 JComponent,我将它添加到(我们现在称之为程序......)程序中,它会弹出它所拥有的图像。然后,我在这张地图上添加了也扩展了 JComponent 的对象(称为点),在添加点之前为这些点分配了自己的侦听器,侦听器可能不是“真正的”侦听器,但它们的行为方式相同,它们是“MouseAdapter”有什么区别吗? /解释编辑 *

* 代码编辑 * 保存代码:

FileOutputStream fOut = new FileOutputStream("testFile.mpd");
ObjectOutputStream outSt = new ObjectOutputStream(fOut);
outSt.writeObject(savedMap);

“testFile.mpd”就是这个样子,我很确定 .mpd 应该没关系,你可以自己编格式,对吧? :) (主类称为 Mappedoodle,.mpd 听起来很合理,不是吗?) "savedMap" 是所述 Mappedoodle 的一个对象,包含所有需要保存的列表和其他信息。

加载代码:

FileInputStream fIn = new FileInputStream("testFile.mpd");
ObjectInputStream inSt = new ObjectInputStream(fIn);    
Mappedoodle openedMap = (Mappedoodle)inSt.readObject();

openedMap 中的信息用于(嗯……应该是……)覆盖程序中的某些内容。 * /代码编辑 *

将所有内容重新添加到该对象上,甚至将所有内容重新添加到列表中也不会那么难,因为这只是更多的列表和一些循环,但我觉得我并没有真正获得 Serializable ^^ 所以,有人愿意解释为什么不是所有的东西都得救了?如果是,为什么我无法访问它?但如果我可以,怎么做? :)

我不知道还有哪些代码应该相关,请告诉我您还需要哪些信息来帮助我解决这个问题,粘贴整个程序真的很麻烦,因为它有 11 个类和好几行。

谢谢

【问题讨论】:

  • 考虑先用更小更简单的代码来学习序列化。
  • 我确实尝试使用用户输入保存/加载 .txt,效果很好!由于我找不到任何关于“对象序列化似乎不适合无缘无故不会被序列化”的信息,我想我会去问问公众。公众知道的东西。很多。
  • 您在序列化或反序列化时遇到了错误,但没有代码很难说。但是我们或您很难梳理出您的大程序中的错误。从小处着手,如果失败,请发布您的代码。
  • 编辑了 OP,添加了更多可能有用的信息以及保存/加载的代码

标签: java serialization jlist serializable


【解决方案1】:

您必须向我们展示的代码必须足以证明您的错误,很遗憾我必须声明您的代码不能。例如,如果我在一个非常简单的示例中使用您的代码(我建议您这样做),您会发现它有效。我的测试代码:

Mappedoodle.java

import java.io.Serializable;

public class Mappedoodle implements Serializable {
   private static final long serialVersionUID = -1760231235147491826L;
   private String text;
   private int value;

   public Mappedoodle(String text, int value) {
      this.text = text;
      this.value = value;
   }

   public String getText() {
      return text;
   }

   public int getValue() {
      return value;
   }

   @Override
   public String toString() {
      return text + ", " + value;
   }

}

MappedoodleSerialize.java

import java.io.*;

public class MappedoodleSerialize {
   public static void main(String[] args) {
      Mappedoodle savedMap = new Mappedoodle("Fubar", 200);
      FileOutputStream fOut;
      try {
         // your code below
         fOut = new FileOutputStream("testFile.mpd");
         ObjectOutputStream outSt = new ObjectOutputStream(fOut);
         outSt.writeObject(savedMap);
      } catch (FileNotFoundException e) {
         e.printStackTrace();
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
}

MappedoodleDeSerialize.java

import java.io.*;

public class MappedoodleDeSerialize {
   public static void main(String[] args) {
      try {
         // your code below
         FileInputStream fIn = new FileInputStream("testFile.mpd");
         ObjectInputStream inSt = new ObjectInputStream(fIn);
         Mappedoodle openedMap = (Mappedoodle) inSt.readObject();
         System.out.println(openedMap);
      } catch (FileNotFoundException e) {
         e.printStackTrace();
      } catch (IOException e) {
         e.printStackTrace();
      } catch (ClassNotFoundException e) {
         e.printStackTrace();
      } finally {
      }
   }
}

这段代码按预期编译、运行和输出。您的错误一定在于您没有向我们展示的代码。

【讨论】:

  • 感谢您抽出宝贵时间尝试此操作,不幸的是,问题不在于编译或对象 toString() 的输出(我也尝试过,效果很好),问题在于我需要将所有内容重新添加到组件中。但是,那个“私有静态最终长序列版本UID = -1760231235147491826L;”对我来说是新事物,对此进行研究。
  • @XistenZ:我从未提到问题出在编译或 toString() 上,而是您在序列化或反序列化对象的方式上存在错误。我们没有办法可以帮助您或根据您提供的信息猜测您的错误是什么。 这就是我想要表达和证明的。如果您仍然需要我们的帮助,我认为您需要提供更多信息。考虑创建并发布SSCCE(请查看链接)。
【解决方案2】:

这个问题在5年前就解决了,但是由于内存不好,解决方案丢失了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-13
    • 2021-02-28
    • 2016-06-30
    • 2015-11-21
    • 2011-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多