如何检查类中的字段是否可序列化?

时间:2016-03-29 14:17:49

标签: c# serialization

我正在开发自己的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以及其他人。我究竟做错了什么?

1 个答案:

答案 0 :(得分:1)

FieldType.IsSerializable检查字段的类型是否可序列化,而不是字段本身。相反,请使用FieldInfo之外的IsNotSerialized

if (!field.IsNotSerialized)
{
    Console.WriteLine(field.Name);
}

值得指出的是NonSerialized属性得到了编译器的特殊处理。与大多数属性不同,这些属性实际上并不会被发送到CIL中,而是在该字段上的标志,因此检查属性的存在可能不起作用。相反,直接检查字段标志是合适的。