2
BindingListおよびISerializableインターフェイスからクラスを派生しました。私は(バイナリ)このクラスをシリアル化したいが、私はその項目をシリアル化することができません。BindingListおよびISerializableインターフェイスから派生クラスをシリアライズ
サンプルコード:
[Serializable]
sealed class SomeData : ISerializable
{
private string name;
public SomeData(string name)
{
this.name = name;
}
private SomeData(SerializationInfo info, StreamingContext ctxt)
{
name = info.GetString("Name");
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("Name", name);
}
}
[Serializable]
class MyList : BindingList<SomeData>, ISerializable
{
public MyList()
{
}
private MyList(SerializationInfo info, StreamingContext ctxt)
{
((List<SomeData>)this.Items).AddRange((List<SomeData>)info.GetValue("Items", typeof(List<SomeData>)));
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("Items", (List<SomeData>)this.Items);
}
}
は今、私はそれをシリアル化しようとします。たとえば、次のようになります。
MyList testList = new MyList();
testList.Add(new SomeData("first"));
testList.Add(new SomeData("second"));
testList.Add(new SomeData("third"));
MemoryStream stream = new MemoryStream();
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(stream, testList);
stream.Seek(0, SeekOrigin.Begin);
MyList deTestList = (MyList)formatter.Deserialize(stream);
deTestListには3つのnullが含まれています。
編集:
private MyList(SerializationInfo info, StreamingContext ctxt)
: base((List<SomeData>)info.GetValue("Items", typeof(List<SomeData>)))
{
}
今deTestList cointains正しいデータ:
誰かが、それはこのMYLISTコンストラクタで動作することがわかりました。
しかし、私はこのしようとすると:
private MyList(SerializationInfo info, StreamingContext ctxt)
: base((List<SomeData>)info.GetValue("Items", typeof(List<SomeData>)))
{
((List<SomeData>)this.Items).AddRange((List<SomeData>)info.GetValue("Items", typeof(List<SomeData>)));
}
deTestListがnullの6つの項目が含まれています。 私はそれを理解していません。
クラスにはサンプルコードでは表示されない別の変数があり、シリアル化をカスタマイズする必要がありますそのため、ISerializableを実装する必要があります。 –
MyListまたはSomeDataのどちらのクラスですか?それらのうちの1つだけがISerializableを実装する場合、動作するようです... –
どちらもISerializableを実装する必要があります。 –