2016-07-12 2 views
1

は、私は、静的なSystem.Versionフィールドでオブジェクトをシリアル化しようとしています:なぜJsonPropertyAttributeでバージョンをシリアル化できないのですか?

[JsonObject(MemberSerialization.OptIn)] 
public class MyObj 
{ 
    [JsonProperty] 
    private static string testStr; 
    [JsonProperty(ItemConverterType = typeof(VersionConverter))] 
    private static Version ver = System.Reflection.Assembly...Version; 

    // some other non-serialized fields 
    // ... 
} 

私はVersionは私がItemConverterTypeとして追加カスタムコンバータを必要とすることthis questionから学びました。しかし、私はこのようにそれをシリアル化しようとすると、それはエラーで失敗します。期待Versionオブジェクトの値

var o = MyObj(); 
using (StreamWriter file = File.CreateText(filename)) 
{ 
    JsonSerializer serializer = new JsonSerializer { Formatting = Formatting.Indented }; 
    serializer.Serialize(file, o); // error 
}  

私はこのようなフィールドの属性を変更する場合、それは正常に動作します:

public class MyObj 
{ 
    ... 
    [JsonProperty] 
    [JsonConverter(typeof(VersionConverter))] 
    private static Version ver = System.Reflection.Assembly...Version; 
    ... 

私は新しい属性です。あなたはなぜ最初のものが失敗するかについていくつかの光を当ててください。私はJson.NETを正しく使用していないと確信していますが、理由を理解できません。

+0

'[JsonProperty]'が適用されたときに静的な**プロパティ**をシリアル化するように見えます。 [JSON .Netでstaticまたはconstメンバー変数をシリアル化できないのはなぜですか?](https://stackoverflow.com/questions/24336597)フィールドをプロパティに変更すると、移動するように設定する必要があります。 – dbc

+0

@dbcありがとう! 'testStr'のシリアル化はうまく動作し、指定されたコンバータを使用して2番目のバージョンも正常に動作することに注意してください。シリアライズのためにコンバーターなしで( 'JsonProperty'のみ)動作しますが、デシリアライズはしません。だから 'ItemConverterType'について何かがあります –

+0

1)本当ですか?それは私がリンクしている答えが時代遅れであることを意味しますか? 2)['ItemConverterType'](http://www.newtonsoft.com/json/help/html/P_Newtonsoft_Json_JsonPropertyAttribute_ItemConverterType.htm)では、コレクションアイテム*に使用するコンバータを指定できます。 [Newtonsoft Json ItemConverterTypeを使用する適切な方法](https://stackoverflow.com/questions/24639750)を参照してください。 'string'と' Version'はコレクションとして扱われないので無視されます。プロパティ自体のコンバーターには '[JsonConverter]'を使います。 – dbc

答えて

0

ItemConverterTypeは、コレクションアイテムに使用するコンバータを指定できます。 Proper way of using Newtonsoft Json ItemConverterTypeを参照してください。 stringVersionはコレクションとして扱われないため、無視されます。プロパティ自体のコンバーターには[JsonConverter]を使用してください。

逆に、static List<Version> versionsがあった場合は、[JsonProperty(ItemConverterType = typeof(VersionConverter))]を使用することが適切です。

関連する問題