微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – 为什么System.Version在JSON字符串不反序列化正确?

上下文:我需要传递一个包含大量属性/字段的对象(从中间层层到UI层).在这属性列表中,一个是类型版本,它没有从 JSON字符串格式正确反序列化.我有一个JSON格式的XML作为JSON序列化字符串将返回短字符串结果.

问题:
System.Version没有正确反序列化.我已经尝试过两个不同的.NET库.以下是每个代码片段:

代码段1使用ServiceStack .NET library

var version = new Version(1,2,3,0);
        string reportJSON = JsonSerializer.SerializetoString<Version>(version);
        //{"Major":1,"Minor":2,"Build":3,"Revision":0,"MajorRevision":0,"MinorRevision":0}


        Version report2 = JsonSerializer.DeserializefromString<Version>(reportJSON);
        string reportJSON2 = JsonSerializer.SerializetoString<Version>(report2);
        //{"Major":0,"Minor":0,"Build":-1,"Revision":-1,"MajorRevision":-1,"MinorRevision":-1}

代码片段2使用Newtonsoft .NET library但结果相同:

var version = new Version(1,0);
        string reportJSON = JsonConvert.SerializeObject(version);
        //{"Major":1,"MinorRevision":0}


        Version report2 = JsonConvert.DeserializeObject<Version>(reportJSON);
        string reportJSON2 = JsonConvert.SerializeObject(report2);
        //{"Major":0,"MinorRevision":-1}

如何解决这个问题?还是哪个其他JSON.NET库可以正常工作?

解决方法

Newtonsoft.Json库在Newtonsoft.Json.Convertersnamespace中提供了一组通用转换器,其中包括可用于序列化和反序列化System.Version的VersionConverter.

请注意,您必须使用VersionConverterboth来进行序列化和反序列化.
这是因为标准序列化将生成eg.:{\”Major\”:1,Minor\”:2,\”Build\”:3,\”Revision\”:0,\”MajorRevision\”:0,\”MinorRevision\”:0},而VersionConverterdeserialization期望一个简单的字符串如“1.2.3”.

所以用法是:

using Newtonsoft.Json;
using Newtonsoft.Json.Converters;  

string s = JsonConvert.SerializeObject(version,new VersionConverter());
Version v = JsonConvert.DeserializeObject<Version>(s,new VersionConverter());

我不知道Newtonsoft的第一个版本是什么.Jsonthat包括该转换器.我有它,它是5.0.6.

原文地址:https://www.jb51.cc/csharp/96242.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐