【发布时间】:2017-11-29 03:21:34
【问题描述】:
我有一个结构 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;
}
序列化
这个结构是一个类的一部分,也就是一个集合的一部分。此代码包含在两个平台上,并在两个平台上运行。
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
为什么输出不同? 为什么一个不能加载另一个?
【问题讨论】:
-
能否也提供序列化代码?
-
为什么输出不同?可能是因为您的
Vector2有一个关联的TypeConverter未在您的问题中显示。请参阅 Newtonsoft.JSON cannot convert model with TypeConverter attribute 了解为什么这很重要。 -
此外,我相信,即使在 Json.NET 中,使用关联的
TypeConverter进行序列化的支持最初仅在 .Net 完整框架构建中可用。对于 .Net 核心(以及我认为的 UWP),它将在 下一个 版本中添加,如 .NET Standard 2.0 #1423 中所述。因此,如果您在 UWP 和桌面上都使用 Json.NET,这可能会解释不一致。 -
@dbc 我添加了其他信息。您对 typeconverter 属性也是正确的,删除它后,我现在可以加载 UWP 构建生成的 JSON。直到现在我才明白它是否相关。