我正在开发自己的JSON序列化程序实现,我需要获得该类的所有可序列化字段。
例如,我有这样的课程:
[Serializable]
class TestClass
{
public int i;
public string s;
[NonSerialized]
public string ignore;
}
所以我不想序列化ignore
。在这段代码中,我尝试打印所有可序列化的字段:
foreach (FieldInfo field in typeof(TestClass).GetFields())
{
if (field.FieldType.IsSerializable)
{
Console.WriteLine (field.Name);
}
}
最终会打印ignore
以及其他人。我究竟做错了什么?
答案 0 :(得分:1)
FieldType.IsSerializable
检查字段的类型是否可序列化,而不是字段本身。相反,请使用FieldInfo
之外的IsNotSerialized
:
if (!field.IsNotSerialized)
{
Console.WriteLine(field.Name);
}
值得指出的是NonSerialized
属性得到了编译器的特殊处理。与大多数属性不同,这些属性实际上并不会被发送到CIL中,而是在该字段上的标志,因此检查属性的存在可能不起作用。相反,直接检查字段标志是合适的。