FormatterServices.GetSerializableMembers为派生类型返回受保护和内部字段两次。一次作为 的实例,SerializationFieldInfo
一次作为RtFieldInfo
.
我觉得这很混乱!谁能帮我理解为什么微软决定以这种方式实现它?
我编写了一个示例程序来重现我的问题:
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
每次都被报告一次。然而,这是运行程序时的实际输出:
衍生A BaseA+privateField (67108865) 衍生B 受保护字段 (67108866) BaseB+protectedField (67108866)
如您所见protectedField
,出现两次,名称不同但元数据标记相同,因此它确实是同一个字段。
谁能解释为什么?