【问题标题】:java.io.NotSerializableException - Unable to deserialize hashmap in Java [duplicate]java.io.NotSerializableException - 无法在 Java 中反序列化 hashmap [重复]
【发布时间】:2013-07-26 23:54:05
【问题描述】:

我正在尝试反序列化哈希图 -

HashMap<String, Movie> map

我定义了Movie和Pic两个类,代码如下所示

类电影

public class Movie implements java.io.Serializable
{
    private static final long serialVersionUID = 1L;
    public String title;
    public Pic poster;
    public Pic[] actors;
    public Pic[] directors;
    public Pic[] writers;
    public String rating;
    public String[] genres;
    public String plot;
    // Also contains a few getters and setters ..
}

班级图片

public class Pic implements java.io.Serializable
{
    private static final long serialVersionUID = 1L;
    String name;
    Boolean isDownloaded;
    public Pic()
    {
        name="";
        isDownloaded=false;
    }
    public Pic(String name,Boolean isdwn)
    {
        this.name = name;
        this.isDownloaded = isdwn;
    }
}

使用“loadObject”函数加载地图 -

@SuppressWarnings("unchecked")
public static HashMap<String, Movie> loadObject(String path)
{
    HashMap<String, Movie> o = null;
      try
      {
         FileInputStream fileIn = new FileInputStream(path);
         ObjectInputStream in = new ObjectInputStream(fileIn);
         o = (HashMap<String, Movie>) in.readObject();
         in.close();
         fileIn.close();
      }
      catch(IOException i)
      {
          System.out.println("\n Exception 1 while loading object \n");
          i.printStackTrace();

      }
      catch(ClassNotFoundException c)
      {
          System.out.println("\n Exception 2 while loading object \n");
      } 
      return o;
} 

因此,此代码用于加载 hashmap 映射 -

        Data.map = Data.loadObject(mappath);

但我无法加载地图,而是得到 java.io.NotSerializableException,堆栈跟踪是

java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: Movie
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1331)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:349)
at java.util.HashMap.readObject(HashMap.java:1030)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:969)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1871)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1775)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1327)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:349)
at Data.loadObject(Data.java:69)
at gui.main(gui.java:113)
Caused by: java.io.NotSerializableException: Movie
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1164)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:330)
at java.util.HashMap.writeObject(HashMap.java:1001)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:940)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1469)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:330)
at Data.saveObject(Data.java:45)
at Data.sync(Data.java:103)
at gui$3.doInBackground(gui.java:618)
at gui$3.doInBackground(gui.java:1)
at javax.swing.SwingWorker$1.call(SwingWorker.java:277)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at javax.swing.SwingWorker.run(SwingWorker.java:316)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
at java.lang.Thread.run(Thread.java:680)

由于所有使用的类都实现了 java.io.Serializable,是什么导致了这个错误??

【问题讨论】:

  • 你把这两个类的所有字段都给我们了吗?关于Serializable 的一件事是,如果对象的某个字段不是,那么对象就不是真正可序列化的。
  • 有几个函数都是公开的并且什么都不返回(void)。还有其他可能导致此错误的原因吗?谢谢!

标签: java exception serialization


【解决方案1】:

真正的问题发生在你序列化对象之前。 javadocWriteAbortedException 是这样说的:

表示ObjectStreamExceptions 之一在写入操作期间被抛出。在写入操作期间抛出 ObjectStreamExceptions 之一时在读取操作期间抛出。

换句话说,当您最初序列化对象时,它引发了您的代码忽略的异常......或没有正确修复。现在,当您尝试反序列化对象时,它说您不能,因为序列化没有正确完成。

查看MoviePic 类,我看不出原始序列化失败的明显原因。我能建议的最好的(目前)是你修复了代码库中的一个早期问题,但忘记删除一些使用早期版本创建的不完整的序列化对象。

【讨论】:

  • 谢谢@Stephen!我认为可能是早期的类之一在生成序列化文件时没有实现 java.io.Serializable。我不得不删除旧的序列化文件并再次生成一个新文件。再次感谢您的帮助!
  • 我遇到了类似的问题,而您关于“真正的问题发生得更早”的观点很有帮助.. 我的控制台堆栈跟踪溢出并得到了真正的异常(原始原因) 在控制台中被替换)
【解决方案2】:

java.io.NotSerializableException: 电影

此异常消息对我来说似乎完全不言自明。重申一下,您的 Movie 类没有实现 Serializable。也许您没有运行您认为正在运行的代码,或者您在发送方和接收方有不同的代码。

【讨论】:

  • -1 鉴于 OP 的代码从一开始就包含 public class Movie implements java.io.Serializable...
  • 他的帖子中没有任何关于“从一开始”的内容。鉴于例外说明了它所说的,OP显然是错误的。例外没有说谎。
  • 它不会说谎,但它会误导......如果你不仔细阅读它。
  • @StephenC 那么它的“误导”方式究竟意味着什么呢?
  • @DennisMeng 查看 OP 在 Stephen C 的回答下的评论,他基本上同意我在这里写的内容。您可能需要重新考虑您的评论。根本没有其他解释,除非你有一个?
猜你喜欢
  • 1970-01-01
  • 2016-08-20
  • 2013-04-04
  • 2023-03-04
  • 2017-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多