我有這樣一類:二進制序列和自動屬性
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