当前位置: 首页 > news >正文

快速建站框架wordpress mylife

快速建站框架,wordpress mylife,做公司网站需要注意哪些,汕头网站建设哪里找在C#领域#xff0c;有很多成熟的开源JSON框架#xff0c;其中最著名且使用最多的是 Newtonsoft.Json ,然而因为版本迭代,其代码要兼容从net2.0到现在的最新的net框架,并且要支持.net平台下的其它语言,所以最新发布版本的Newtonsoft.Json其dll大小接近700k,另一方面,因为其复…   在C#领域有很多成熟的开源JSON框架其中最著名且使用最多的是 Newtonsoft.Json ,然而因为版本迭代,其代码要兼容从net2.0到现在的最新的net框架,并且要支持.net平台下的其它语言,所以最新发布版本的Newtonsoft.Json其dll大小接近700k,另一方面,因为其复杂的迭代历史导致它的代码为了维护向下扩展性和向上兼容性而舍弃一些性能。  如果你不太在乎体积和性能的话那么 Newtonsoft.Json 无疑是一款很好的选择。但是如果你在意性能的话在github上仍然有一些出名的以速度为称的c# JSON框架其中最为人知的应该是 JIL , JIL有着出色的性能是因为它采用了大量的加速技术但这也带来了一些局限性它不够灵活对object类型的解析必须得调用它的另一个API并且因为出于性能考虑其采用的是Emit技术不易维护在我的测试中有很多类型它不支持。但是JIL的地位是显而易见的因为它的出现github上有着很多相仿思路的以速度为称的JSON框架几乎每个都称自己是最快的但实际上很少有超越JIL的并且它们中的大部分没有一个良好的文档这导致我在做性能测试时我想改个配置都得对源码全局搜索花费一定时间。  在说回程序集大小JIL的最新发布版本是500k并且其依赖一个库加起来是800k大小。  那么我讲这些大家应该知道我想要表达什么  是的考虑到前面种种这些都不是在某种场景最理想化的那种JSON库所以我写了一款以体积更小速度更快类型覆盖更广的开源C# JSON框架它叫KoobooJson在我正式介绍KoobooJson之前我要介绍一下什么是KoobooKooboo是我们老板用C#编写的一个开源的非常神奇的网站开发工具它是一个类CMS生成器但其从数据库前端引擎到各种网络协议服务器都是用c#自主创造的几乎很少使用到第三方库它编译后的发布版本仅有几M而正是因为仅仅只有几M为了Json框架不要太影响主程序的大小这才有了KoobooJson此次的诞生Kooboo是开源的https://github.com/Kooboo/KoobooKoobooJson自然也是开源的https://github.com/Kooboo/Json在NuGet包中可以直接搜索 KoobooJson 下载使用即可什么是KoobooJson?  KoobooJson是一款C#的JSON工具其主要通过表达式技术构建最低支持.NET4.5(可以支持.NET4.0但考虑到一些因素最终没有支持有需要支持的可以自行源码分支更改。另外几乎每个以性能号称的JSON框架都最低支持.NET4.5)最低支持.NET Core 2.0提交小巧性能出色类型覆盖广是KoobooJson的优点KoobooJson的优点小巧快速覆盖类型广KoobooJson的实现  (后续我将出一篇新的文章详细讲解实现)序列化反序列化功能介绍忽略注释忽略互引用所导致的堆栈循环忽略Null值排序特性忽略序列化元素序列化时仅包含该元素时间格式首字母大小写别名特性反序列化时指定构造函数值格式化特性全局Key格式化其它KoobooJson的优点1. 小巧目前KoobooJson只有130k, 并且没有任何额外依赖项, KoobooJson当前支持框架版本.NET4.5 .NET Core2 .NET Standard 22. 快速KoobooJson 遵循JSON RFC8259规范, 是一款适用于C#的快速的Json文本序列化器它基于表达式树构建, 在运行时会动态的为每个类型生成高效的解析代码, 这过程包括: 利用静态泛型模板进行缓存, 避免字典查询开销, 避免装箱拆箱消耗, 缓冲池复用, 加速字节复制...KoobooJson生成代码的方式并没有采用Emit, 而是采用ExpressionTree. ExpressionTree相比Emit而言, 它不能像Emit直接写出最优的IL代码, 它依赖于下层的编译器, 在某些时候它会多生成一些不必要的IL代码路径, 故而性能上有所逊色. 但相较于几乎没有类型检查的Emit而言, ExpressionTree不会出现各种莫名其妙的错误, 它更加安全, 也更加容易扩展维护.虽然ExpressionTree与Emit相比在性能方面可能会有所差异, 但是KoobooJson的表现却相当亮眼! 上图是使用BenchmarkDotNet在Net Core2.1上做的Json序列化和反序列化的性能测试,随机生成大量的测试数据,迭代100次后产生的结果,基准报告在这里BenchmarkDotNetv0.11.4, OSWindows 10.0.17763.316 (1809/October2018Update/Redstone5) Intel Core i7-8550U CPU 1.80GHz (Kaby Lake R), 1 CPU, 8 logical and 4 physical cores .NET Core SDK2.1.505 [Host] : .NET Core 2.1.9 (CoreCLR 4.6.27414.06, CoreFX 4.6.27415.01), 64bit RyuJIT Job-XEQPPS : .NET Core 2.1.9 (CoreCLR 4.6.27414.06, CoreFX 4.6.27415.01), 64bit RyuJITIterationCount100 LaunchCount1 WarmupCount13. 覆盖类型广在类型定义上, KoobooJson并没有单独实现每个集合或键值对类型, 而是对这些FCL类型进行划分成不同的模板a. KoobooJson将序列化分为5种类型原始类型 它包括 Boolean, Byte, SByte, Int16, UInt16, Int32, UInt32, Int64, UInt64, IntPtr, UIntPtr, Char, Double, and Single.所有拥有键值对行为的类型任何能够实现IDictionary或能够实现IDictionary且能够通过构造函数注入键值对的类型, 都将以键值对方式进行解析所有拥有集合行为的类型 任何能够实现IEnumable并且满足IColloction的Add行为或拥有自己独特的集合行为且能够通过构造函数注入集合的类型, 都将以集合方式进行解析特殊类型 如Nullable, Lazy, Guid, Datatable, DateTime, Type, Task, Thread, Timespan...等等这些特定的类型实现常规Model的键值对类型 在KoobooJson中, 如果当类型不满足上述4种时, 将会以键值对的形式来对其解析, KoobooJson会对Model中公开的所有元素进行序列化, 在这个环节, 几乎配置器中所有的配置都是有关Model的. 诸如别名, 忽略特性, 指定构造函数, 忽略堆栈循环引用, 首字母大小写, 格式化器... 值得一提的是, 在对接口类型进行反序列化时, KoobooJson默认会自动创建并返回一个实现于该接口的对象.b. 在对类型的解析上, 其中浮点型,日期时间类型, GUID的解析是参照了JIL的代码, 在此表示感谢.作为一款活跃的Json库, KoobooJson会不断支持更多的类型, 这其中, 因为对FCL中的键值对和集合的行为进行归纳, 所以对于这两种类型, KoobooJson并不像其它框架一样去特定的为每种类型单独实现, 实际上, 第2和3所定义的规则可以容纳FCL中的大多数键值对或集合类型.目前KoobooJson所覆盖的类型包括 : Hashtable, SortedList, ArrayList, IDictionary, Dictionary,, IList,List, IEnumerable, IEnumerable, ICollection, ICollection, Stack, Queue, ConcurrentBag, ConcurrentQueue, ConcurrentStack, SortedDictionary,, ConcurrentDictionary,, SortedList,, IReadOnlyDictionary,, ReadOnlyDictionary,, ObservableCollection, HashSet, SortedSet, LinkedList, ReadOnlyCollection, ArraySegment, Stack, Queue, IReadOnlyList, IReadOnlyCollection, ReadOnlyCollection, ISet, BitArray, URI, NameValueCollection, StringDictionary, ExpandoObject, StringBuilder, Nullable, Lazy, Guid, Datatable, DateTime, Type, Task, Thread, Timespan, Enum, Exception, Array[], Array[,,,,,]...KoobooJson的实现序列化class UserModel{public object Obj;public string Name;public int Age;}string json JsonSerializer.ToJson(new UserModel());在对类型第一次序列化时, KoobooJson会为这个类型生成大致是这样的解析代码.void WriteUserModel(UserModel model,JsonSerializerHandler handler){ ...配置选项处理...格式化器处理...堆栈无限引用处理... handler.sb.Write(Obj:) WriteObject(model.Obj);//在序列化时将为Object类型做二次真实类型查找 handler.sb.Write(Name:) WriteString(model.Name); handler.sb.Write(Age:) WriteInt(model.Age);}如果是ListUserModel的话, 那么将生成这样的代码handler.sb.Write([)foreach(var user in users){ WriteUserModel(user); WriteComma()}handler.sb.Write(])在当前版本中, KoobooJson序列化使用的容器为StringBuilder, 与直接ref char[]相比, 多了一些额外的调用. 将考虑在下个版本中构建一个轻便的char容器, 并会区分对象大小, 考虑栈数组和通过预扫描大小来减少对内存的开销,这将显著提升序列化速度.反序列化在对类型进行第一次反序列化时, KoobooJson会为这个类型生成大致是这样的解析代码.UserModel model JsonSerializer.ToObjectUserModel({\Obj\:3,\Name\:\Tom\,\Age\:18});void ReadUserModel(string json,JsonDeserializeHandler handler){ ...Null处理... ReadObjLeft() 空元素处理...构造函数处理...配置项处理...格式化器处理...while(i--0){switch(gechar()) {case O:switch(getchar())case b:switch(getchar())case j: ReadQuote(); ReadObject();if(getchar(),) i; } } ReadObjRight()}KoobooJson生成反序列化代码, KoobooJson会假设json格式完全正确, 没有预先读取Json结构部分, 而是直接使用代码来描述结构, 所以KoobooJson少了一次对json结构的扫描, 执行过程中如果json结构发生错误, 会直接抛出异常.而对于key的匹配, KoobooJson生成的是逐个char的自动机匹配代码, 目前KoobooJson是以字典树为算法, 逐个char进行类型比较, 与一次比较多个char相比, 这种方式显然没有达到最小的查询路径, 不过在jit优化下, 两种方式实现经测试效率几乎一样.在反序列化读取字符时, 因为是对类型动态生成编码, 提前知道每个类型中的元素的字节长度和其类型的值长度, 所以KoobooJson出于更高的性能对反序列化采取了指针操作, 并加速字节读取.case 3:if (*(int*)Pointer ! *(int*)o) return false;if (*(Pointer 2) ! *(o 2)) return false;goto True;case 4:if (*(long*)Pointer ! *(long*)o) return false;goto True;case 5:if (*(long*)Pointer ! *(long*)o) return false;if (*(Pointer 4) ! *(o 4)) return false;因为是指针操作, KoobooJson在反序列化环节几乎不需要去维护一个char池来存放下一个需要读取的json结构片段.功能介绍KoobooJson当前仅支持3个API调用string Kooboo.Json.JsonSerializer.ToJsonT(T value, JsonSerializerOption optionnull)T Kooboo.Json.JsonSerializer.ToObjectT(string json, JsonDeserializeOption optionnull)object Kooboo.Json.JsonSerializer.ToObject(string json, Type type, JsonDeserializeOption optionnull)忽略注释在json字符串的读取中KoobooJson会自动忽略注释string json /*注释*/ {//注释 /*注释*/Name /*注释*/: /*注释*/CMS /*注释*/,//注释 /*注释*/ Children:[//注释 1/*注释*/, 2/*注释*/ ]//注释 }//注释 /*此处*/;var obj JsonSerializer.ToObject(json);objNameCMSobjChildrenArray(2)忽略互引用所导致的堆栈循环class A{public B b;}class B{public A a;}A.bB;B.aA;A指向B, B指向A, 在序列化时这种情况会发生无限循环.可通过KoobooJson的序列化配置项中的属性来设定这种情况下所对应的结果JsonSerializerOption option new JsonSerializerOption{ ReferenceLoopHandling JsonReferenceHandlingEnum.Null};string json JsonSerializer.ToJson(a, option);json {\b\:{\a\:null}}------ReferenceLoopHandling JsonReferenceHandlingEnum.Emptyjson {\b\:{\a\:{}}}-----ReferenceLoopHandling JsonReferenceHandlingEnum.Removejson {\b\:{}}忽略Null值class A{public string a;}A.anull;JsonSerializerOption option new JsonSerializerOption { IsIgnoreValueNull true };var json JsonSerializer.ToJson(A, option);json {}排序特性class A{ [JsonOrder(3)]public int a; [JsonOrder(2)]public int b; [JsonOrder(1)]public int c;}可通过[JsonOrder(int orderNum)]来排序序列化的json元素位置. 如果是正常没有通过[JsonOrder]排序元素,那么解析出来的Json则是默认顺序{a:0,b:0,c:0} 上面样例通过[JsonOrder]排序后是这样的{c:0,b:0,a:0}忽略序列化元素class A{ [IgnoreKey]public int a;public int b; }可通过[IgnoreKey]特性来标记序列化和反序列化要忽略的元素 json {b:0} 当然, 也可以通过配置来动态选择忽略对象JsonSerializerOption option new JsonSerializerOption { IgnoreKeys new Liststring(){b} };var json JsonSerializer.ToJson(A, option);json {}序列化时仅包含该元素class A{ [JsonOnlyInclude]public int a;public int b; public int c; }json {\a\:0}如果一个model里包含几十个元素, 而你仅想序列化其中一个, 那么就没必要对每一个元素进行[IgnoreKey]标记,只需要对想要序列化的元素标记[JsonOnlyInclude]即可时间格式JsonSerializerOption option new JsonSerializerOption { DatetimeFormatDatetimeFormatEnum.ISO8601 };json 2012-01-02T03:04:05ZJsonSerializerOption option new JsonSerializerOption { DatetimeFormatDatetimeFormatEnum.RFC1123 };json Thu, 10 Apr 2008 13:30:00 GMTJsonSerializerOption option new JsonSerializerOption { DatetimeFormatDatetimeFormatEnum.Microsoft };json \/Date(628318530718)\/首字母大小写class A {public int name; } JsonSerializerOption option new JsonSerializerOption { JsonCharacterReadJsonCharacterReadStateEnum.InitialUpper }; json {\Name\:0}在对model序列化时可以指定key的首字母大小写,反序列化时也可以设置对字符串不区分大小写.首字母大小写属于内嵌支持, 在解析时并不会影响性能别名特性 class A { [Alias(R01_Name)]public int name; } json {\R01_Name\:0}当元素被标记[Alias]后,KoobooJson无论序列化还是反序列化都会按照Alias来进行解析反序列化时指定构造函数class A{public A(){} [JsonDeserializeCtor(3,ss)]public A(int a,string b){}}在反序列化的时候, 我们不得不调用构造函数来以此创建对象. 在常规情况下, KoobooJson会通过优先级自动搜索最合适的构造函数,其优先级顺序为: public noArgs private noArgs public Args private Args, 这其中, 会对有参构造函数进行默认值构造.然而你也可以显式通过[JsonDeserializeCtor(params object[] args)]特性来指定反序列化时的构造函数, 这样 当KoobooJson创建A实例的时候就不是通过new A(); 而是new A(3,ss);值格式化特性 class A { [Base64ValueFormat]public byte[] a; }当你需要来覆写由KoobooJson进行元素解析的行为时, 我们可以继承一个 ValueFormatAttribute 来覆写行为. class Base64ValueFormatAttribute:ValueFormatAttribute {public override string WriteValueFormat(object value,Type type, JsonSerializerHandler handler, out bool isValueFormat) { isValueFormattrue;if(valuenull)return null;elsereturn ConvertToBase64((byte[])value); }public override object ReadValueFormat(string value,Type type, JsonDeserializeHandler handler, out bool isValueFormat) { isValueFormattrue;if(valuenull)return null;elsereturn Base64Convert(value); }}值格式化特性也可以标记在结构体或类上, 而另一点是对于值格式化器, 也可以以全局的方式来进行配置以序列化为例, 可通过 JsonSerializerOption中的GlobalValueFormat委托来进行配置JsonSerializerOption.GlobalValueFormat(value,type,handler,isValueFormat){if(typetypeof(byte[])) { isValueFormattrue;if(valuenull)return null;elsereturn ConvertToBase64((byte[])value); }else { isValueFormatfalse;return null; }}值得注意的是,对于byte[]类型的base64解析行为, KoobooJson已经内嵌在配置项中, 只要设置JsonSerializerOption.IsByteArrayFormatBase64true即可全局Key格式化对于Model中的Key处理, KoobooJson支持全局的Key格式化器. class R01_User {public string R01_Name; public int R01_Age; }如果我们想把R01这个前缀给去掉, 只需要注册全局Key格式化器的委托即可JsonSerializerOption.GlobalKeyFormat(key,parentType,handler){if(parentTypetypeof(R01_User)) {return key.Substring(4); }return key;}这样,出来的json是这样的{Name:,Age:}同样, 对于反序列化我们也同样应该注册JsonDeserializeOption.GlobalKeyFormat(key,parentType){if(parentTypetypeof(R01_User)) {return R01_key; }return key;} 原文地址https://www.cnblogs.com/1996V/p/10607916.html.NET社区新闻深度好文欢迎访问公众号文章汇总 http://www.csharpkit.com
http://www.zqtcl.cn/news/278397/

相关文章:

  • 做网站滨州wordpress 不同域名
  • 找人做设计的网站广州做网站(信科网络)
  • 如何选择网站做站方向青之峰网站建设
  • 福州哪家网站制作设计高端还实惠设计logo的理念
  • 吉林市网站建设促销式软文案例
  • 三门峡市建设局网站网站开发费用是否资本化
  • 建设部网站官网 施工许可杭州萧山网站开发
  • 福建省建设资格注册管理中心网站竹子建站怎么样
  • 想做一个什么样的网站网站建设功能评价指标
  • 网站建设渠道合作友情链接是免费的吗
  • wordpress如何制作网站网站建设及推广方案ppt
  • 关于建设门户网站的通知重庆刮刮卡制作
  • 网站建设和维护工作内容凡科网免费建站步骤及视频
  • 如何用c 做网站最新疫苗接种最新消息
  • 营销型网站建设报价wordpress 注册 登录界面
  • 网站编辑器哪个好黄骅网站建设价格
  • 爱站工具包官网下载国外cdn
  • 郑州便宜网站建设做网站横幅的图片多大
  • 网站建设的未来wordpress防黑客插件
  • 个人备案网站可以做支付吗做娱乐新闻的网站有哪些
  • 国家建设部网站网站导航如何做半透明
  • 长治网站设计制作网站网站是用什么软件做的
  • wordpress成长记录网站模版市场推广方案ppt
  • 外贸网站建设560wordpress 在线音乐播放器
  • 大连哪里有手机自适应网站建设维护交互式网站开发技术asp
  • 潍坊做网站多少钱个人业务网站带后台
  • 网站建设灬金手指科杰全部游戏免费(试玩)
  • 石家庄网站设计宜昌市住房和城乡建设局网站
  • 商城型企业网站的功能中山市中国建设银行网站
  • 公司做网站那个网站好网站推广seo方法