5

我使用 BinaryFormatter 将以下类序列化到一个文件中:

[Serializable]
public class TestClass
{
    public String ItemTwo { get; set; }
    public String ItemOne { get; set; }
}

使用此代码:

FileStream fs = new FileStream("DataFile.dat", FileMode.Create);
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(fs, new TestClass{ItemOne = "ItemOne", ItemTwo = "ItemTwo"});
fs.Close();

使用此代码反序列化时:

FileStream fs = new FileStream("DataFile.dat", FileMode.Open);
BinaryFormatter formatter = new BinaryFormatter();
TestClass addresses = (TestClass)formatter.Deserialize(fs);
fs.Close();

我什么都正常。但是,现在我需要该类具有一些支持字段,如下所示:

[Serializable]
public class TestClass
{
    private string _itemTwo;
    private string _itemOne;

    public String ItemTwo
    {
        get { return _itemTwo; }
        set { _itemTwo = value; }
    }

    public String ItemOne
    {
        get { return _itemOne; }
        set { _itemOne = value; }
    }
}

我的问题是,由于某种原因,以前版本的反序列化不再起作用。我得到了课程,但属性为空。
我不能影响序列化过程或以前的类状态。
如何让文件反序列化为当前类?

4

1 回答 1

6

如果您尝试序列化第一个版本TestClass的后场,二进制格式化程序将自动序列化。自动属性只是语法糖,编译器将它们转换为带有支持字段的普通属性。例如,如果您使用ILSpy反编译原始控制台应用程序(或类库),您将看到您的私有字段被声明为:

.field private string '<ItemOne>k__BackingField'

这与您的第二个声明与支持字段不同,后者产生:

.field private string _itemOne

一种方法是ISerializable在您的接口上声明接口并使用类SerializationInfoTestClass中包含的信息获取原始属性的值

[Serializable]
public class TestClass : ISerializable
{
    private string _itemTwo;
    private string _itemOne;

    public String ItemTwo
    {
        get { return _itemTwo; }
        set { _itemTwo = value; }
    }

    public String ItemOne
    {
        get { return _itemOne; }
        set { _itemOne = value; }
    }

    protected TestClass(SerializationInfo info, StreamingContext context)
    {
        _itemTwo = info.GetString("<ItemTwo>k__BackingField");
        _itemOne = info.GetString("<ItemOne>k__BackingField");
    }

    [SecurityPermissionAttribute(SecurityAction.Demand,
    SerializationFormatter = true)]
    public virtual void GetObjectData(SerializationInfo info, StreamingContext context)
    {
        //Add data to your serialization process here
    }
}

所以你告诉BinaryFormatter你希望你的支持字段在反序列化期间如何初始化。

于 2015-04-16T14:13:23.670 回答