2016-07-12 17 views
1

Ich versuche, ein Objekt mit einem statischen System.Version Feld zu serialisiert:Warum Serialisierung Version mit JsonPropertyAttribute nicht funktioniert?

[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 
    // ... 
} 

ich von this question gelernt haben, dass Version einen benutzerdefinierten Konverter benötigt, die ich als ItemConverterType hinzugefügt. Aber wenn ich versuche, es so serialisiert werden, schlägt es mit dem Fehler: Expected Version Objektwert:

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

Es funktioniert gut, wenn ich die Eigenschaften des Feldes wie folgt ändern:

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

Ich bin neu in Attribute. Kannst du bitte ein wenig Licht in die Frage bringen, warum der erste fehlschlägt? Ich bin mir ziemlich sicher, dass ich Json.NET nicht richtig verwende, aber ich kann nicht herausfinden, warum.

+0

Scheint, als ob es nur statische ** Eigenschaften ** serialisiert, wenn '[JsonProperty]' angewendet wird. Siehe [Warum kann JSON .Net statische oder konstante Membervariablen nicht serialisieren?] (Https://stackoverflow.com/questions/24336597) Ändern Sie Ihre Felder in Eigenschaften, und Sie sollten auf going gehen. – dbc

+0

@dbc danke! Beachten Sie, dass die Serialisierung des 'testStr' funktioniert, und die 2. Version mit dem angegebenen Konverter funktioniert auch. Es funktioniert sogar ohne den Konverter (nur 'JsonProperty') zum Serialisieren, aber nicht zum Deserialisieren. Es gibt also etwas über 'ItemConverterType' –

+0

1) Wirklich? Bedeutet das, dass die Antwort, die ich verlinkt habe, veraltet ist? 2) ['ItemConverterType'] (http://www.newtonsoft.com/json/help/html/P_Newtonsoft_Json_JsonPropertyAttribute_ItemConverterType.htm) ermöglicht es Ihnen, einen Konverter anzugeben, der für * Sammelobjekte * verwendet werden soll. Siehe [Richtige Verwendung von NewtonSoft Json ItemConverterType] (https://StackOverflow.com/questions/24639750). Da 'string' und' Version' nicht als Sammlungen behandelt werden, werden sie ignoriert. Für einen Konverter auf der Eigenschaft selbst verwenden Sie '[JsonConverter]'. – dbc

Antwort

0

ItemConverterType können Sie einen Konverter für Kollektion Artikel angeben. Siehe Proper way of using Newtonsoft Json ItemConverterType. Da string und Version nicht als Sammlungen behandelt werden, werden sie ignoriert. Verwenden Sie für einen Konverter auf der Eigenschaft selbst [JsonConverter].

Umgekehrt, wenn Sie eine static List<Version> versions hatten, wäre es angemessen, [JsonProperty(ItemConverterType = typeof(VersionConverter))] zu verwenden.