我有这样的课:
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# 字符,它怎么可能工作?
换句话说:
老 Foo 的 IBar 字段名称(我的猜测):k__BackingField
新 Foo 的 IBar 字段名称:_bar
显然它们不匹配,那么 BinaryFormatter 如何克服这个问题?