2

新しいセッションで Java のファイルからオブジェクトをデシリアライズする際に問題があります。

arraylist をファイルにシリアル化し、同じセッションで逆シリアル化することはできますが、新しい Main オブジェクトを作成し、前のセッションで機能した同じファイルを逆シリアル化しようとすると、コードが機能しません。

これはなぜでしょうか?

これが私のコードです:

public void LoadPersonListFromFile(String Filename)
{
  try
  {
     PersonList = new ArrayList<Person>();          
     ObjectInputStream in = new ObjectInputStream(new FileInputStream(Filename));
     ArrayList<Person> PersonList = (ArrayList<Person>) in.readObject();
     in.close();
  }
  catch (Exception e)
  {
     e.printStackTrace();
  }
}

public void SavePersonFileToFile(String Filename)
{
  try
  {
     ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(Filename));
     out.writeObject(PersonList);
     out.close();
  }
  catch (Exception e)
  {
     e.printStackTrace();
  }
} 

編集

LoadPersonListFromFile メソッドのリストで .size() 呼び出しを行うと、値 2 が得られるため、DeSerialization が機能しているようです。ただし、LoadPersonListFromFile の外部のリストで .size() メソッドを呼び出すとメソッドでは、.size() が 0 として表示されます。これはなぜでしょうか? 逆シリアル化された ArrayList をプライベート フィールドにコピーする必要がありますか?

クラスの先頭に ArrayList を格納する次のプライベート フィールドがあります。

private ArrayList<Person> PersonList;

EDIT2

動作しました。コードは次のとおりです。

public void LoadPersonListFromFile(String Filename)
{
  try
  {
     ObjectInputStream in = new ObjectInputStream(new FileInputStream(Filename));
     ArrayList<Person> PersonListFromFile = (ArrayList<Person>) in.readObject();
     in.close();
     PersonList = PersonListFromFile;       
    }
  catch (Exception e)
  {
     e.printStackTrace();
  }
}
4

1 に答える 1

1

クラスで static final longserialVersionUIDを定義していないようです。Person基本的に、ソース コードで定義されSerializableていないクラスをコンパイルすると、Java コンパイラはランダムな値でそれを定義します。serialVersionUID

Personこの問題を解決するには、クラスで次を定義します。

private static final long serialVersionUID = 1L;
于 2013-05-13T07:41:36.793 に答える