我在一些库程序集中有一个可序列化的类。 我也有引用这个程序集的项目。 一个项目序列化我的班级实例, 其他项目序列化了我班级的这个实例。
我将此程序集的dll复制到某个备份文件夹中,以便能够恢复旧版本。
我在班上添加了新字段。 我序列化了我更新的类的实例。 然后我恢复了我的类的旧版本并反序列化了实例。 BinaryFormatter运行良好,不会抛出异常。
我们需要[optionalField]属性吗?
库
using System;
namespace SerializationFramework
{
[Serializable]
public class MyClass
{
public string Field { get; set; }
//public string NewField { get; set; }//added in Version 2, without [OptionalField] attribute
public MyClass()
{
Field = "test";
//NewField = "newField";
}
//for checking versions
public void Test()
{
Console.WriteLine("Version 1");//comment after adding a new field
//Console.WriteLine("Version 2");//uncomment after adding a new field
Console.ReadLine();
}
}
}
序列化
using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using SerializationFramework;
namespace Serialization
{
class Program
{
static void Main(string[] args)
{
var binaryF = new BinaryFormatter();
var obj = new MyClass();
using (var f = File.Create(@"C:\temp\oleg.txt"))
{
binaryF.Serialize(f, obj);
}
Console.WriteLine("Serialized!");
Console.ReadLine();
}
}
}
反序列化
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using SerializationFramework;
namespace Deserialization
{
class Program
{
static void Main(string[] args)
{
var binaryF = new BinaryFormatter();
MyClass obj;
using (var f = File.Open(@"c:\temp\oleg.txt", FileMode.Open))
{
obj = (MyClass) binaryF.Deserialize(f);
}
//CheckingVersion
var obj2 = new MyClass();
obj2.Test();
}
}
}