FormatterServices.GetSerializableMembers zwraca dwukrotnie zabezpieczone i wewnętrzne pola dla typów pochodnych. Raz jako instancja SerializationFieldInfo
i raz jako RtFieldInfo
.GetSerializableMembers (FormatterServices) zwraca dwukrotnie to samo pole! Czemu?
Uważam, że jest to bardzo mylące! Czy ktoś może mi pomóc zrozumieć, dlaczego Microsoft zdecydował się wdrożyć go w ten sposób?
Pisałem przykładowy program, który ponownie produkować mój problem:
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();
}
}
Spodziewam się, że privateField
i protectedField
podano raz każda. Jednak jest to rzeczywista moc przy uruchamianiu programu:
DerivedA BaseA+privateField (67108865) DerivedB protectedField (67108866) BaseB+protectedField (67108866)
Jak widać protectedField
pojawiają się dwa razy, z różnymi nazwami, ale z tego samego metadanych żeton więc jest to rzeczywiście ten sam obszar.
Czy ktoś może wyjaśnić, dlaczego?
Podobno jest to znane od pewnego czasu: http://msdn.microsoft.com/en-us/library/2bb1dc1s(v=vs.90).aspx (sekcja komentarzy). –
Ale nadal nie ma wyjaśnienia ... :-( –