2016-03-29 22 views
0

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

@JamesDevはい、それはタイプミスです。しかし、[NonSerialized]を使用しても、正常に動作しません。 – Amir

答えて

1

FieldType.IsSerializableは、フィールドの型がフィールドではなくシリアル化可能かどうかをチェックします。代わりに、FieldInfoのオフIsNotSerializedを使用します。

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

それはNonSerialized属性は、コンパイラによって、特別な治療を受けることを指摘する価値があります。ほとんどの属性とは異なり、この属性は実際にCILに放出されるのではなく、フィールドのフラグであるため、属性の有無を確認することはできません。代わりに、フィールドのフラグを直接チェックするのが適切です。

+0

これは説明が正しい答えです。 –

+0

ありがとう、それは動作します!また、明確な説明に感謝します。 – Amir

関連する問題