java.io.NotSerializableException - 无法在Java中反序列化hashmap [英] java.io.NotSerializableException - Unable to deserialize hashmap in Java

查看:191
本文介绍了java.io.NotSerializableException - 无法在Java中反序列化hashmap的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图反序列化一个hashmap -

  HashMap< String,Movie>地图

我已经定义了两个类Movie和Pic,代码如下



类电影

  public class Movie实现java.io.Serializable 
{
private static final long serialVersionUID = 1L;
public String title;
public Pic海报;
public Pic [] actors;
public Pic []董事;
public Pic []作家;
public String rating;
public String []流派;
public String plot;
//还包含几个getter和setters ..
}

类Pic

  public class Pic实现java.io.Serializable 
{
private static final long serialVersionUID = 1L ;
字符串名称;
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(\\\
异常1,加载对象\\\
);
i.printStackTrace();

}
catch(ClassNotFoundException c)
{
System.out.println(\\\
异常2加载对象\\\
时);
}
return o;
}

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

  Data.map = Data.loadObject(mappath);但是我无法加载地图,而是获取java.io.NotSerializableException,stacktrace是

  java.io.WriteAbortedException:write aborted; java.io.NotSerializableException:电影
在java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1331)
在java.io.ObjectInputStream.readObject(ObjectInputStream.java:349)
在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)
在java.lang.reflect.Method.invoke(Method.java:597)
在java.io.ObjectStreamClass。 invokeReadObject(ObjectStreamClass.java:969)
java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1871)
java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1775)
在java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1327)
在java.io.ObjectInputStream.readObject(ObjectInputStream.java:349)
在Data.loadObject(Data.java:69)
at gui.main(gui.java: 113)
导致:java.io.NotSerializableException:Movie java.io.ObjectOutputStream.writeObject0上的
(ObjectOutputStream.java:1164)
在java.io.ObjectOutputStream.writeObject(ObjectOutputStream。 java:330)
在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)
在java.lang.reflect.Method.invoke(Method.java:597)
在java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:940)
在java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1469)
在java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream .java:1400)
在java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158)
在java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:330)
在数据。 saveObject (Data.java:45)
在Data.sync(Data.java:103)
在gui $ 3.doInBackground(gui.java:618)
在gui $ 3.doInBackground(gui。 java:1)
在javax.swing.SwingWorker $ 1.call(SwingWorker.java:277)
在java.util.concurrent.FutureTask $ Sync.innerRun(FutureTask.java:303)
在java.util.concurrent.FutureTask.run(FutureTask.java:138)
在javax.swing.SwingWorker.run(SwingWorker.java:316)
在java.util.concurrent.ThreadPoolExecutor $ Worker.runTask(ThreadPoolExecutor.java:895)
在java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:918)
在java.lang.Thread.run(Thread.java: 680)

由于所有使用的类实现java.io.Serializable,是什么原因导致此错误?

解决方案

当序列化对象时,真正的问题发生在更早。 javadoc WriteAbortedException 说:


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




换句话说,当你最初序列化对象时,它抛出了你的代码被忽略的异常,或者没有正确的修复。现在,当您尝试反序列化该对象时,它表示您不能因为序列化未正确完成。



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


I am trying to deserialize a hashmap -

HashMap<String, Movie> map

I have defined two classes Movie and Pic, code shown below

Class Movie

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 ..
}

Class Pic

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;
    }
}

The map is loaded using a 'loadObject' function -

@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;
} 

Hence, this code is used to load the hashmap map -

        Data.map = Data.loadObject(mappath);

But i am unable to load the map and instead getting java.io.NotSerializableException, the stacktrace is

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)

Since all classes used implement java.io.Serializable, what is causing this error ??

解决方案

The real problem occurred earlier when you serialized the object. The javadoc for WriteAbortedException says this:

Signals that one of the ObjectStreamExceptions was thrown during a write operation. Thrown during a read operation when one of the ObjectStreamExceptions was thrown during a write operation.

In other words, when you originally serialized the object, it threw an exception that your code ignored ... or didn't remediate properly. Now when you attempt to deserialize the object, it says you can't because the serialization did not complete properly.

Looking at the Movie and Pic classes, I can't see an obvious reason for original serialization to fail. The best I can suggest (for now) is that you fixed an earlier problem in your code base, but forgot to delete some incomplete serialized objects that were created using the earlier version.

这篇关于java.io.NotSerializableException - 无法在Java中反序列化hashmap的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆