我们什么时候需要[OptionalField]?

时间:2017-12-19 15:03:42

标签: c# serialization versioning binaryformatter

我在一些库程序集中有一个可序列化的类。 我也有引用这个程序集的项目。 一个项目序列化我的班级实例, 其他项目序列化了我班级的这个实例。

我将此程序集的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();
        }
    }
}

0 个答案:

没有答案
相关问题