2017-11-29 11 views
1

Ich habe eine Struktur, Vector2, die bei der Serialisierung zu JSON eine andere outpout auf verschiedenen Plattformen produziert.Warum ändert sich das JSON-Format zwischen Windows-Plattformen

Struct Ich Serialisierung:

#if XNADESIGNPROVIDED 
[System.ComponentModel.TypeConverter(typeof(Microsoft.Xna.Framework.Design.Vector2TypeConverter))] 
#endif 
[DataContract] 
[DebuggerDisplay("{DebugDisplayString,nq}")] 
[DebuggerStepThrough] 
    public struct Vector2 : IEquatable<Vector2> 
    { 
     [DataMember] 
     public float X; 

     [DataMember] 
     public float Y; 
} 

Serialisierung

Diese Struktur Teil einer Klasse ist, ist, dass ein Teil einer Sammlung. Dieser Code ist auf beiden Plattformen enthalten und wird auf beiden Plattformen ausgeführt.

private static readonly JsonSerializerSettings JsonSerializerSettings = new JsonSerializerSettings() { NullValueHandling = NullValueHandling.Ignore }; 

public string ToJson() 
    { 
     return JsonConvert.SerializeObject(this, JsonSerializerSettings); 
    } 

public static MenuEntryCollection FromJson(string in_Data) 
    { 
     return JsonConvert.DeserializeObject<MenuEntryCollection>(in_Data); 
    } 

Ergebnis aus UWP Serializer:

"SizeRelative": { 
     "X": 224.0, 
     "Y": 63.9999847 
    }, 

Ergebnis aus Desktop-Seralizer:

"SizeRelative": "384, 64", 

Mit Newtonsoft Json.net, 10.0.3

Warum ist die Ausgabe ist unterschiedlich ent? Und warum kann man das andere nicht laden?

+1

Können Sie den Serialisierungscode auch angeben? – mehran

+2

* Warum ist die Ausgabe anders? * Wahrscheinlich, weil Ihre 'Vector2' einen zugeordneten' TypeConverter' hat, der in Ihrer Frage nicht angezeigt wird. Siehe [Newtonsoft.JSON kann das Modell mit dem TypeConverter-Attribut nicht konvertieren] (https://Stackoverflow.com/q/31325866/3744182), warum dies wichtig ist. – dbc

+1

Weiter, ich glaube, sogar innerhalb Json.NET, Unterstützung für Serialisierung mit einem zugeordneten 'TypeConverter' war ursprünglich nur in der .Net Full Framework Build (s). Für .Net-Kern (und UWP ich denke) wird es in der ** nächsten ** Version hinzugefügt werden, wie in [.NET Standard 2.0 # 1423] (https://github.com/JamesNK/Newtonsoft.Json/issues/1423). Wenn Sie Json.NET sowohl in UWP als auch auf dem Desktop verwenden, könnte dies die Inkonsistenz erklären. – dbc

Antwort

1

JSON.NET verwendet einen zugeordneten TypeConverter, wenn dieser für die Klasse/struct verfügbar ist, war dies ursprünglich nur im .NET Framework verfügbar.

Für .Net-Kern und UWP wird es in der nächsten Version als Teil von .NET Standard 2.0 hinzugefügt, also wenn Sie Json.NET in UWP und Desktop verwenden, ist das wahrscheinlich das Problem.

Suchen Sie nach einem TypeConverter auf Ihrer Klasse/Struktur. Wenn Sie sie entfernen, sollte JSON.NET auf den Standard-Serializer zurückfallen, was Sie wahrscheinlich bei Ihren UWP-Builds bekommen.

Verwandte Themen