4

ゲームプレイ中にWindowsPhone7ゲームが破壊された場合、必要な要素をシリアル化して、ゲームに戻ったときに保存されたデータを逆シリアル化し、ユーザーが中断したところから続行できるようにします。質問のリスト(questionList)とボードピースのリスト(boardPieces)があります。これらは両方とも、私のゲームから離れるときにシリアル化/逆シリアル化され、すべて正常に機能しているようです。質問に答えると、その質問はリストから削除されます。

questionList.Remove(boardPiece.Question);

これは、ゲームをトゥームストーンしてそこに戻るまで(リストがシリアル化/逆シリアル化された後)、問題なく機能します。次に、questionList.Remove...が正しく機能しません。ブレークポイントを介してデータを確認しましたが、questionListには一致するアイテムがあるように見えますが、Listを介してデータを削除しようとしています。削除はサイレントに失敗し、アイテムは削除されません。

回避策を見つけたのは、questionListをループし、一致するboardPieceを検索してから、単にRemoveを使用するのではなく、インデックス(RemoveAt)を介して削除することです。質問はせいぜい16個しかないので、パフォーマンスへの影響はあまりないようですが、データを逆シリアル化した後にRemoveが失敗する理由を知りたいので、少なくとも何かを学びます。ハッシュか何かが一致していませんか?何も思いつきません... :(

これがquestionListをシリアル化する方法です(boardPiecesでも同じように機能します):

XmlSerializer questionListSerializer = new XmlSerializer(typeof(QuestionHelper));
writer.WriteStartElement("QuestionList");
writer.WriteAttributeString("Count", questionList.Count.ToString());
foreach (QuestionHelper question in questionList)
    questionListSerializer.Serialize(writer, question);
writer.WriteEndElement();

そして、これがどのように逆シリアル化されるかです(boardPiecesについても同じ考えです):

XmlSerializer questionListSerializer = new XmlSerializer(typeof(QuestionHelper));
int questionListCount = int.Parse(reader.GetAttribute("Count"));
reader.Read();
for (int i = 0; i < questionListCount; i++)
    questionList.Add(questionListSerializer.Deserialize(reader) as QuestionHelper);
if (questionListCount > 0)
    reader.Read();
4

1 に答える 1

3

XmlSerializerツリーシリアライザーです。同じオブジェクトがグラフで2回見つかった場合、2回シリアル化されます。デシリアライズする場合、これは2つの別個のオブジェクトであり、たまたま同じように見えます。etcはequalityを使用しますが、これはデフォルトでreference-equalityであるためRemove、これがおそらく問題です。つまり、逆シリアル化されたオブジェクトの場合、2つのオカレンスは同じ参照ではなくなります。したがって、見つかりません。

オプション:

  • 実際のデータを宣言する場合を除いて、ID/キーのみをシリアル化します。オブジェクトはシリアル化しません。デシリアライズ後の修正
  • オブジェクト参照をサポートできるシリアライザーを使用する(ではないXmlSerializer
于 2012-04-26T20:16:52.827 に答える