当前位置: 首页 > 编程语言 > C#

使用Json.NET序列化XNA矩形分享

时间:2023-04-10 15:26:32 C#

使用Json.NET序列化XNA矩形stringjson=JsonConvert.SerializeObject(newRectangle(-3,6,32,32),Formatting.Indented);控制台.WriteLine(json);矩形反序列化矩形=JsonConvert.DeserializeObject(json);一切都按预期工作。控制台输出为:“3,6,32,32”但是当我想对XNARectangle执行相同操作时,出现错误。(只是将旧用法替换为“使用Microsoft.Xna.Framework;”;)控制台输出是:“{X:-3Y:6Width:32Height:32}”它抛出的错误是:“Errorconvertingvalue“{X:-3Y:6宽度:32高度:32}”用于输入“Microsoft.Xna.Framework.Rectangle”。为什么会这样?出了什么问题,我该如何解决?我做了一些检查,这是导致异常的代码:},输出convertedValue);实际调用转换工作的委托找不到这种类型的转换器。调查原因,因为序列化程序能够正确地序列化和反序列化其他类型。编辑:这不起作用,因为XNARectangle类型定义为:[Serializable][TypeConverter(typeof(RectangleConverter))]publicstructRectangle:IEquatableJson.NET检索TypeConverter类型,并在其上调用此方法:TypeConverterfromConverter=GetConverter(目标类型);if(fromConverter!=null&&fromConverter.CanConvertFrom(initialType)){//deserialize}RectangleConverter有一个标志“supportsStringConvert=false”,因此尝试将字符串转换成它失败。这就是反序列化这个特定对象失败的原因。我找到了一种方法让Newtonsoft.Json(Json.Net)与XNA的Rectangle类配合得很好。首先,你的形状应该是一种属性,所以你可以给它一个JsonConverter属性:publicclassSprite{[JsonConverter(typeof(MyRectangleConverter))]publicRectangleRectangle;}publicclassMyRectangleConverter:JsonConverter{publicoverridevoidWriteJson(JsonWriterwriter,objectvalue,JsonSerializerserializer){varrectangle=(Rectangle)value;varx=rectangle.X;vary=矩形.Y;varwidth=rectangle.Width;varheight=rectangle.Height;varo=JObject.FromObject(new{x,y,width,height});o.WriteTo(作家);}publicoverrideobjectReadJson(JsonReaderreader,TypeobjectType,objectexistingValue,JsonSerializerserializer){varo=JObject.Load(reader);varx=GetTokenValue(o,"x")??0;vary=GetTokenValue(o,"y")??0;varwidth=GetTokenValue(o,"width")??0;varheight=GetTokenValue(o,"height")??0;返回新的矩形(x,y,宽度,高度);}publicoverrideboolCanConvert(TypeobjectType){thrownewNotImplementedExcepti在();私人静态整数?GetTokenValue(JObjecto,stringtokenName){JTokent;返回o.TryGetValue(tokenName,StringComparison.InvariantCultureIgnoreCase,outt)?(int)t:(int?)null;它可能会得到改进,因此感谢反馈这是我迄今为止找到的最佳解决方案:if(objectType==typeof(Rectangle)){returnCreateObjectContract(objectType);}returnbase.CreateContract(objectType);}}并且只要配置Newtonsoft.JSON就可以使用解析器以上就是C#学习教程:使用Json.NET序列XNARectangular分享的所有内容,如果对你有用还需要详细了解C#学习教程,希望大家多多关注——varsettings=newJsonSerializerSettings(){ContractResolver=newXnaFriendlyResolver(),};varrect=JsonConvert.DeserializeObject(jsonData,settings);本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: