我有这样一类:二进制序列和自动属性
public class Foo
{
public IBar {get;set;}
//tons of other properties
}
public interface IBar
{
//whatever
}
类用于二进制序列化(标准使用的BinaryFormatter的)。 IBar的实现以[Serializable]标记,因此一切正常。
现在我想不要序列化栏和保留向后兼容性(它没有在代码中引用)。 NonSerialized属性似乎够用了。但是,它只能应用于字段,而不能应用于自动属性。所以我试过这个:
public class Foo
{
private IBar _bar;
[NonSerializable]
public IBar Bar
{
get { return _bar; }
set { _bar = value; }
}
}
令人惊讶的是,它运行良好 - 我可以反序列化旧的Foos和新的。
我的问题是:如果这些字段是序列化的字段,并且自动属性的后台字段可能在其名称中包含一些非C#字符,它怎么可能工作?
换句话说:
老Foo的伊巴尔字段名(我猜测):k__BackingField
新富的伊巴尔字段名称:_bar
显然它们不匹配,所以如何BinaryFormatter的克服了这一?
当你说该属性从未在代码中引用并不意味着它总是'null'?如果是这样的话,为什么它可以反序列化整个二进制不兼容性的答案是,它实际上从来不需要。 – JRoughan 2013-02-28 11:06:15
我不够精确。该属性在构造函数中被分配了一个值。它从未在其他地方引用过。坦率地说,它应该从Foo中删除。 – dzendras 2013-02-28 12:08:01
您的“旧”代码在语法上是错误的 - 请指定属性名称,因为它几乎肯定会影响行为。 – 2017-05-31 15:23:54