【发布时间】:2013-02-28 10:38:23
【问题描述】:
我有这样的课:
public class Foo
{
public IBar {get;set;}
//tons of other properties
}
public interface IBar
{
//whatever
}
该类用于二进制序列化(BinaryFormatter 的标准使用)。 IBar 的实现标有 [Serializable],因此一切正常。
现在我不想序列化 Bar 并保持向后兼容性(反正代码中没有引用它)。 NonSerialized 属性似乎就足够了。但是,它只能应用于字段,不能应用于自动属性。所以我尝试了这个:
public class Foo
{
private IBar _bar;
[NonSerializable]
public IBar Bar
{
get { return _bar; }
set { _bar = value; }
}
}
令人惊讶的是它运行良好 - 我既可以反序列化旧的 Foos 也可以反序列化新的。
我的问题是:如果这些是序列化的字段并且自动属性的支持字段的名称中可能包含一些非 C# 字符,它怎么可能工作?
换句话说:
Old Foo 的 IBar 字段名(我猜):k__BackingField
新 Foo 的 IBar 字段名称:_bar
显然它们不匹配,那么 BinaryFormatter 如何克服这个问题?
【问题讨论】:
-
当您说该属性从未在代码中引用时,这是否意味着它始终为
null?如果是这样,为什么它可以反序列化二进制不兼容的答案是它实际上从来没有必要。 -
我不够精确。该属性在构造函数中分配了一个值。它从未在其他地方引用过。坦率地说,它应该从 Foo 中删除。
-
您的“旧”代码在语法上是错误的——请指定属性名称,因为它几乎肯定会影响行为。
标签: c# deserialization .net-4.5 binaryformatter binary-serialization