質問

私はデ/そうのようなオブジェクトをシリアル化しています

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>));
  }
}

リスト内にあるオブジェクトのないのシリアル化属性を持っています。シリアライズすると、エラーがスローされていないと、リストには、のことはありませんの空ですが、私のリストのすべてをデシリアライズ時にしている、ヌルであり、私がなぜわかりません。

CQによって答えとして

私はこれをマーキングしています。私は/適切にシリアライズん小さな1オフのテストアプリを作る私が使用しようとしているオブジェクトをデシリアライズすることができましたが、私はまだそれが私の生産コードで動作するように取得するように見えることはできませんが、私はそれは小さな何かだと思われるI 「行方不明メートルます。

役に立ちましたか?

解決

まあリストは、あなたが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]);

出力を忘れました..

  

シリアライズされたオブジェクトが754bytesである

     

1:こんにちは2:世界

他のヒント

あなたはあなたのリストがヌルであることを言うとき、

は、リスト自体がnullであること、またはそれがnullのエントリで満たされていることを意味するのですか?後者の場合、これは知られている。ネットの問題である:<のhref = "https://stackoverflow.com/questions/2400805/deserializing-a-class-containing-a-listt-why-is-list-initially見ます-filled-で-NUL ">同じ問題に私の質問をするます。

基本的には、List<T>sは、彼らだけが直列化復元されたときに初期化されます。オブジェクトグラフが直列化復元された後、そこに含まれるオブジェクトのみを直列化復元されています。これを回避する一つの方法は、OnDeserialized方法、または[OnDeserializedAttribute]と一つにそれらを必要とするすべてのコードを配置することです。 MSDN

scroll top