c# - 带/不带支持字段的二进制格式化程序和属性

标签 c# properties deserialization binaryformatter backing-field

我使用 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; }
    }
}

我的问题是现在,出于某种原因,以前版本的反序列化不再有效。我得到了类(class),但属性为空。
我不能影响序列化进程,也不能影响之前的类状态。
如何让文件反序列化为当前类?

最佳答案

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

.field private string '<ItemOne>k__BackingField'

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

.field private string _itemOne

一种方法是在您的TestClass 上声明ISerializable 接口(interface),并使用类SerializationInfo 中包含的信息获取原始属性的值。

[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 您希望在反序列化期间如何初始化支持字段。

关于c# - 带/不带支持字段的二进制格式化程序和属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29676594/

相关文章:

c# - 如何部署 COM

c# - 覆盖 MinimumLevel 在 Serilog 中不起作用

java - 使用 Jackson 序列化和反序列化 Java 泛型 : StackOverflowError

c# - 如何在服务器端验证我的自定义 Oauth2 访问 token

java - 来自外部 jar 的 seam i18n 属性文件

c# - 无效的 Resx 文件。无法加载类型 System.Collections.Generic.List

java - 使用 Java 中的属性文件中的值更新数据库

gwt - 使用 GWT 中内置的 RPC 序列化/反序列化机制

java - 更改实例状态不会反射(reflect)在序列化对象中

c# - 如何在当前版本的 Roslyn 中获取 SyntaxToken.Kind?