私はこのようなクラスを持っています:
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; }
}
}
驚くべきことに、これはうまく機能します。古い Foo と新しい Foo の両方を逆シリアル化できます。
私の質問は、これらがシリアル化されたフィールドであり、自動プロパティのバッキング フィールドの名前に C# 以外の文字が含まれている可能性がある場合、どのように機能するのでしょうか?
言い換えると:
古い Foo の IBar フィールド名 (私の推測): k__BackingField
新しい Foo の IBar フィールド名: _bar
明らかにそれらは一致しないので、BinaryFormatter はこれをどのように克服するのでしょうか?