5

私は次のようにオブジェクトをデシリアライズしています:

public class myClass : ISerializable
{
  public List<OType> value;

  public myClass(SerializationInfo info, StreamingContext context)
  {
    this.value = (List<OType>)info.GetValue("value", typeof(List<OType>));
  }

  void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
  {
    info.AddValue("value", value, typeof(List<OType>));
  }
}

リストにあるオブジェクトには Serializable 属性があります。シリアル化するとエラーはスローされず、リストが空になることはありませんが、逆シリアル化するとすべてのリストが null になり、その理由がわかりません。

これをCQで回答済みとしてマークしています。使用しようとしているオブジェクトを適切にシリアル化/逆シリアル化する小さな 1 回限りのテスト アプリを作成することができましたが、まだ実稼働コードで動作させることができないようですが、それは小さなものであると思われます。行方不明です。

4

2 に答える 2

5

あなたのリストが null であると言うとき、それはリスト自体が null であるということですか、それとも null エントリで埋め尽くされているということですか? 後者の場合、これは .Net の既知の問題です。同じ問題に関する私の質問を参照してください。

基本的に、List<T>s はデシリアライズ時にのみ初期化されます。それらに含まれるオブジェクトは、オブジェクト グラフが逆シリアル化された後にのみ逆シリアル化されます。OnDeserializedこれを回避する1つの方法は、それらを必要とするコードをメソッドに入れるか、 [OnDeserializedAttribute]. MSDNを参照してください。

于 2010-08-10T08:41:48.643 に答える
3

リストは最初は常に空ですが、設定していmyClass.value = new List<...>();ますか?また、データが実際に保存されていることを確認できるように、シリアル化されたデータをバイナリ形式と xml 形式の両方で保存しましたか?

2.0 以降を使用している場合、絶対シリアル化を制御する必要がない場合は ISerializable を実装する必要はありません。値をパブリック プロパティに変更すると、独自にシリアル化されます。

編集:次のケースは、私にとっては正常にシリアル化および逆シリアル化されているようです。質問全体を誤解している場合に備えて、これを投稿しています。

厄介なテストコードを無視して、これが少し役立つことを願っています.

    [Serializable]
    public class OType
    {
        public int SomeIdentifier { get; set; }
        public string SomeData { get; set; }

        public override string ToString()
        {
            return string.Format("{0}: {1}", SomeIdentifier, SomeData);
        }
    }

    [Serializable]
    public class MyClass : ISerializable
    {
        public List<OType> Value;

        public MyClass() {  }

        public MyClass(SerializationInfo info, StreamingContext context)
        {
            this.Value = (List<OType>)info.GetValue("value", typeof(List<OType>));
        }

        void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
        {
            info.AddValue("value", Value, typeof(List<OType>));
        }
    }

...

        var x = new MyClass();

        x.Value = new OType[] { new OType { SomeIdentifier = 1, SomeData = "Hello" }, new OType { SomeIdentifier = 2, SomeData = "World" } }.ToList();

        var xSerialized = serialize(x);

        Console.WriteLine("Serialized object is {0}bytes", xSerialized.Length);

        var xDeserialized = deserialize<MyClass>(xSerialized);

        Console.WriteLine("{0} {1}", xDeserialized.Value[0], xDeserialized.Value[1]);

出力を忘れた..

シリアル化されたオブジェクトは 754 バイトです

1: ハロー 2: ワールド

于 2009-02-05T18:06:47.747 に答える