加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 使用BinaryFormatter将自动实现的属性更改为正常和反序列

发布时间:2020-12-15 05:37:07 所属栏目:百科 来源:网络整理
导读:我有一个实现像属性的对象 public String Bla {get;set;} 将实现更改为类似之后 private String _bla;public String Bla{ get { return _bla; } set { _bla = value; } } 在反序列化中,这个属性是空的. 我有来自旧实现的大量序列化数据,并希望使用新实现加载
我有一个实现像属性的对象
public String Bla {get;set;}

将实现更改为类似之后

private String _bla;

public String Bla
{
    get { return _bla; }
    set { _bla = value; } 
}

在反序列化中,这个属性是空的.

我有来自旧实现的大量序列化数据,并希望使用新实现加载它们

有没有办法,改变实现与旧的二进制文件兼容?

编辑:

有些人可能遇到同样的问题,所以这是我的hackish解决方案:

自动生成的字段的命名约定是无效的c#代码:

[CompilerGenerated]
private string <MyField>k__BackingField;

[CompilerGenerated]
public void set_MyField(string value)
{
    this.<MyField>k__BackingField = value;
}

[CompilerGenerated]
public string get_MyField()
{
    return this.<MyField>k__BackingField;
}

对我来说快速而肮脏的修复是在源代码中创建一个名为xMyFieldxK__BackingField的私有支持字段,

并通过替换< MyField>的所有出现来修补序列化的二进制数据.在反序列化之前使用xMyFieldx

解决方法

尝试实现ISerializable
[SecurityCritical]
    public virtual void GetObjectData(SerializationInfo info,StreamingContext context)
    {
        if (info == null)
            throw new ArgumentNullException("info");

        info.AddValue("name of compiler generated field",_bla);
    }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读