0

ハッシュマップをデシリアライズしようとしています -

HashMap<String, Movie> map

Movie と Pic の 2 つのクラスを定義しました。以下にコードを示します。

クラスムービー

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 を実装しているため、このエラーの原因は何ですか??

4

2 に答える 2

6

実際の問題は、オブジェクトをシリアル化したときに発生しました。のjavadocWriteAbortedExceptionは次のように書かれています:

書き込み操作中にいずれかObjectStreamExceptionsがスローされたことを示します。ObjectStreamExceptionsいずれかが書き込み操作中にスローされたときに、読み取り操作中にスローされます。

つまり、最初にオブジェクトをシリアル化したときに、コードが無視する例外をスローしたか、または適切に修正しなかったということです。オブジェクトを逆シリアル化しようとすると、シリアル化が正しく完了していないため、できないと表示されます。

Movieとクラスを見てもPic、元のシリアル化が失敗する明確な理由がわかりません。私が (今のところ) 提案できる最善の方法は、コード ベースの以前の問題を修正したものの、以前のバージョンを使用して作成されたいくつかの不完全なシリアル化されたオブジェクトを削除するのを忘れていたことです。

于 2013-07-27T04:10:57.140 に答える
-3

java.io.NotSerializableException: ムービー

この例外メッセージは、私にとっては一目瞭然のようです。言い換えると、あなたの Movie クラスは Serializable を実装していません。おそらく、実行していると思われるコードを実行していないか、送信側と受信側で異なるコードを使用している可能性があります。

于 2013-07-27T02:02:32.053 に答える