2017-12-21 2 views
1

Ich bin mir bewusst, warum Serialisierung von statischen Variablen standardmäßig nicht funktionieren würde, aber die Antworten auf this question scheinen anzuzeigen, dass es mit den richtigen Attributen möglich ist.JSON Statische Eigenschaften Serialisierung funktioniert nicht

Meine Klasse sieht wie folgt aus:

[JsonObject(MemberSerialization.OptIn)] 
public class c 
{ 
    [JsonProperty] 
    public static double x{ get; set; } = 70; 
    [JsonProperty] 
    public static double y{ get; set; } = 36; 
    [JsonProperty] 
    public static double z{ get; set; } = 12; 
} 

Und es tritt JSON.net durch

StatePersister.SaveState(new c(), fileName); 


public static void SaveState(Object o, string savePath, FileFormat? format = null) 
{ 
    DataContractJsonSerializerSettings settings = new DataContractJsonSerializerSettings { UseSimpleDictionaryFormat = true }; 
    DataContractJsonSerializer serializer = new DataContractJsonSerializer(o.GetType(), settings); 
    using (var stream = File.Create(savePath)) 
    { 
     using (var writer = JsonReaderWriterFactory.CreateJsonWriter(stream, Encoding.UTF8, true, true, "\t")) 
     { 

      serializer.WriteObject(writer, o); 
      writer.Flush(); 
     } 
    } 
} 

Ich habe versucht, es mit und ohne [JsonObject (MemberSerialization.OptIn)] Attribut und So oder so bekomme ich eine Datei, die nur "{}" enthält

Durch den Code Ich weiß, dass das Objekt instanziiert wird, und es wird im richtigen Objekt mit der übergeben richtige Information.

+0

Warum haben Sie statische Eigenschaften? Warum machen Sie sie nicht stattdessen nicht statisch? –

+0

Aus den gleichen Gründen verwendet jeder statische Variablen. Wir brauchen Variablen, die von überall im Code zugänglich sind. Da es nie mehr als eine Instanz geben muss, wäre das Umgehen einer einzelnen Instanz unordentlich und könnte Möglichkeiten für viele Fehler eröffnen. Alle Änderungen an diesen Eigenschaften, die von überall vorgenommen werden, müssen über das gesamte Programm hinweg synchronisiert werden. – ccwscott

Antwort

2

Sie verwenden Json.Net-Attribute, aber Sie verwenden den Json.Net-Serializer nicht. DataContractJsonSerializer ist Teil des .Net-Frameworks, nicht Json.Net, daher werden [JsonObject] und [JsonProperty] Attribute nicht berücksichtigt. Darüber hinaus unterstützt DataContractJsonSerializer nicht serialisieren statische Mitglieder, auch wenn Sie die richtigen Attribute damit verwenden ([DataContract] und [DataMember], bzw.). Sie müssen stattdessen Json.Net JsonSerializer verwenden, wenn Sie statische Mitglieder serialisieren möchten.

using (var stream = File.Create(savePath)) 
using (TextWriter textWriter = new StreamWriter(stream, Encoding.UTF8)) 
using (JsonWriter jsonWriter = new JsonTextWriter(textWriter)) 
{ 
    JsonSerializer serializer = new JsonSerializer(); 
    serializer.Serialize(jsonWriter, o); 
} 

Fiddle: https://dotnetfiddle.net/lYzDEE

Hinweis: Wenn Ihr JSON klein ist, dass Sie nicht wirklich zu einem Strom benötigen. Sie können Ihren Code dazu vereinfachen:

string json = JsonConvert.SerializeObject(o); 
File.WriteAllText(savePath, json, Encoding.UTF8); 
+0

Das hat funktioniert, ich habe nur eine alte Methode aufgerufen, die wir erstellt haben. Das neue war das, das auf JSON.net aktualisiert wurde und es hat gut funktioniert. Die Daten, die wir exportieren, sind im Allgemeinen auch ziemlich groß. Ich habe nur eine Unterstichprobe für die Post zur Verfügung gestellt. – ccwscott

Verwandte Themen