为什么 JSON 保存格式在 windows 平台之间变化

Why is the JSON save format changing between windows platforms

我有一个结构 Vector2,当它序列化为 JSON 时会在不同的平台上产生不同的输出。

我正在序列化的结构:

#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;
}

序列化

此结构是 class 的一部分,即集合的一部分。此代码包含在两个平台上,运行 在两个平台上。

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);
    }

UWP 序列化程序的结果:

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

Desktop Seralizer 的结果:

"SizeRelative": "384, 64",

使用 Newtonsoft Json.net、10.0.3

为什么输出不同? 为什么一个不能加载另一个?

JSON.NET 使用关联的 TypeConverter(如果在 class/struct 上可用),这最初仅在 .Net 完整框架中可用。

对于 .Net 核心和 UWP,它将在下一个版本中添加,作为 .NET Standard 2.0 的一部分,因此如果您在 UWP 和桌面中都使用 Json.NET,这可能就是问题所在.

检查 class/struct 上的 TypeConverter。删除它应该 JSON.NET 回退到默认序列化程序,这可能是您在 UWP 构建中获得的。