FormatterServices.GetSerializableMembersは、派生型に対してprotectedフィールドとinternalフィールドを2回返します。いったんSerializationFieldInfo
のインスタンスとして1回、RtFieldInfo
として1回。GetSerializableMembers(FormatterServices)は同じフィールドを2回返します。どうして?
私はこれが非常に混乱していることを発見しました!マイクロソフトがなぜこのように実装することにしたのか誰でも理解できますか?
私は私の問題を再生産するサンプルプログラムを書かれている:
class Program
{
[Serializable]
public class BaseA
{
private int privateField;
}
[Serializable]
public class DerivedA : BaseA { }
[Serializable]
public class BaseB
{
protected int protectedField;
}
[Serializable]
public class DerivedB : BaseB { }
static void Main(string[] args)
{
Program.PrintMemberInfo(typeof(DerivedA));
Program.PrintMemberInfo(typeof(DerivedB));
Console.ReadKey();
}
static void PrintMemberInfo(Type t)
{
Console.WriteLine(t.Name);
foreach (var mbr in FormatterServices.GetSerializableMembers(t))
{
Console.WriteLine(" {0} ({1})", mbr.Name, mbr.MetadataToken);
}
Console.WriteLine();
}
}
私はprivateField
とprotectedField
は、一度、各報告されることを期待します。
DerivedA BaseA+privateField (67108865) DerivedB protectedField (67108866) BaseB+protectedField (67108866)
あなたはprotectedField
は異なる名前で同じメタデータを、2回表示さ見ることができるようにトークンので、それは確かに非常に同じフィールドである。しかし、これは、プログラムを実行している実際の出力です。
誰でも理由を説明できますか?
これはしばらくの間知られていました。http://msdn.microsoft.com/en-us/library/2bb1dc1s(v=vs.90).aspx(コメントセクション) –
しかし、まだ説明はありません。:-( –