Java 理解可序列化问题

Java 理解可序列化问题,java,serialization,jlist,serializable,Java,Serialization,Jlist,Serializable,刚开始使用可序列化的东西,我想保存一些列表和一些其他对象,但我似乎无法正确地处理一些事情 我有一些JLists,它们有自己的“DefaultListModel”,我使用它对列表中的内容进行排序,我称之为SortModel类,当我运行程序时,我会执行以下操作: SortModel sortModel = new SortModel(); JList jList = new JList(sortModel); 然后,当程序运行时,会根据指定的需要添加和排序对象,现在,当我保存列表并再次加载它们时,

刚开始使用可序列化的东西,我想保存一些列表和一些其他对象,但我似乎无法正确地处理一些事情

我有一些JLists,它们有自己的“DefaultListModel”,我使用它对列表中的内容进行排序,我称之为SortModel类,当我运行程序时,我会执行以下操作:

SortModel sortModel = new SortModel();
JList jList = new JList(sortModel);
然后,当程序运行时,会根据指定的需要添加和排序对象,现在,当我保存列表并再次加载它们时,它们是空的

我还保存了一个类的对象,该类包含程序的背景(用户自己选择一个),保存后我需要再次将其添加到程序中(对象,背景存储在其中),我需要再次将其添加到程序中,而不仅仅是“按其位置”加载它,另外,我有一些对象,我用它们自己的侦听器添加到该对象上。在我以某种方式成功加载它之后,对象就在那里,但我不能使用它们,所以我想侦听器不会被保存

*解释编辑 这个程序的类扩展了JFrame,我觉得这一点都不好笑。 “background obect”(称之为map)扩展了JComponent,我将其添加到(现在称之为program…)程序中,它会弹出它所保存的图像。在这张地图上,我添加了同样扩展JComponent的对象(称为点),这些点在添加之前被分配了自己的侦听器,这些侦听器可能不是“真正的”侦听器,但它们的行为方式相同,它们是“MouseAdapter”,这有什么区别吗?。 /edit*

*代码编辑* 保存代码:

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中的信息被用来覆盖程序中的某些内容。 */code edit*

将所有内容重新添加到此对象上,甚至将所有内容重新添加到列表中也不难,因为这只是一些列表和一些循环,但我觉得我真的无法序列化^^^^所以,有人想解释一下为什么不保存所有内容吗?如果是,为什么我不能访问它?但如果我能,怎么做?:)

我不知道还有什么相关的代码,请告诉我你需要什么更多的信息来帮助我解决这个问题,粘贴整个程序会非常混乱,因为它有11个类和相当多的行


谢谢您必须向我们展示的代码必须足以证明您的错误,不幸的是,我必须声明您的代码不足以证明您的错误。例如,如果我在一个非常简单的示例中使用您的代码(我建议您这样做),您将看到它是有效的。我的测试代码:

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();
      }
   }
}
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 {
      }
   }
}
MappedoodleDeSerialize.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();
      }
   }
}
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 {
      }
   }
}

这段代码按预期编译、运行和输出。你的错误一定在于你没有给我们看的代码。

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

首先考虑使用更小更简单的代码学习序列化。我确实尝试过用用户输入保存/加载.txt,效果非常好!由于我找不到任何关于“对象序列化似乎不适合,没有明显的原因不会被序列化”的信息,我想我应该去问问公众。公众知道一些事情。很多。你在序列化或反序列化时都有一个bug,但是没有代码很难说。但是,我们或您很难找出大型程序中的错误。从小事做起,如果失败了,发布你的代码。编辑了OP,添加了更多可能有用的信息和保存/加载代码感谢你花时间尝试这一点,不幸的是,问题不在于编译或对象到字符串()的输出(我也尝试过,效果很好),问题是我需要将所有内容添加回组件。但是,“private static final long serialVersionUID=-1760231235147491826L;”对我来说是一个新东西,对此进行了研究。@XistenZ:我从来没有提到编译或toString()的问题,而是在序列化或反序列化对象的方式上存在缺陷。我们无法根据您提供的信息帮助您或猜测您的bug是什么。这就是我想说的和要证明的。如果你仍然需要我们的帮助,我认为你需要提供更多的信息。考虑创建和张贴(请检查链接)。