テストのシリアル化可能なオブジェクトを作成します。
[Serializable]
public class TestObject : ISerializable
{
public string FirstName;
public TestObject()
{
}
public TestObject(SerializationInfo info, StreamingContext context)
{
FirstName = info.GetString("firstName");
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("firstName", FirstName);
}
}
そして、それをシリアル化します:
var test = new TestObject { FirstName = "John" };
using (var stream = new FileStream(@"c:\temp\test.dat", FileMode.Create, FileAccess.Write))
{
var formatter = new BinaryFormatter();
formatter.Serialize(stream, test);
}
OptionalFied を持つようにクラスを変更し、古いシリアル化されたオブジェクトを逆シリアル化しようとします。
[Serializable]
public class TestObject : ISerializable
{
public string FirstName;
[OptionalField]
public string SecondName;
public TestObject()
{
}
public TestObject(SerializationInfo info, StreamingContext context)
{
FirstName = info.GetString("firstName");
SecondName = info.GetString("secondName");
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("firstName", FirstName);
}
新しいオプション フィールドを読み取るようにコンストラクターを変更すると、"SecondName = info.GetString("secondName");" で例外がスローされます。
using (var stream = new FileStream(@"c:\temp\test1.dat", FileMode.Open, FileAccess.Read))
{
var formatter = new BinaryFormatter();
var myInstance = (TestObject)formatter.Deserialize(stream);
}
ISerializable を実装するときに OptionalFieldAttribute が実際にはサポートされていないということですか?