java.io.NotSerializableException - 无法在Java中反序列化hashmap [英] java.io.NotSerializableException - Unable to deserialize hashmap in Java
问题描述
我试图反序列化一个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屋!