栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Json.NET缓存类型的序列化信息吗?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Json.NET缓存类型的序列化信息吗?

是的,它确实。
Json.NET在其

IContractResolver
DefaultContractResolver
和中缓存类型序列化信息
CamelCasePropertyNamesContractResolver
。除非您指定自定义合同解析器,否则此信息将被缓存和重用。

对于

DefaultContractResolver
全局静态实例,只要应用程序未指定其自己的合同解析器,Json.NET就会在内部维护该实例。
CamelCasePropertyNamesContractResolver
另一方面,维护所有实例之间共享的静态表。(我认为不一致是由遗留问题引起的;有关详细信息,请参见此处。)

这两种类型均设计为完全线程安全的,因此线程之间的共享应该不是问题。

如果选择实现和实例化自己的合同解析器,则仅当您缓存和重用合同解析器实例本身时,类型信息才会被缓存和重用。因此,Newtonsoft
建议:

为了提高性能,您应该一次创建合同解析器,并在可能的情况下重用实例。解决合同的速度很慢,并且IContractResolver的实现通常会缓存合同。

如果存在内存消耗问题,
并且出于任何原因需要最大限度地减少缓存的合同永久占用的内存,则可以构造自己的本地实例

DefaultContractResolver
(或某些自定义子类),使用该实例进行序列化,然后立即删除对其的所有引用,例如:

public class JsonExtensions{    public static string SerializeObjectNoCache<T>(T obj, JsonSerializerSettings settings = null)    {        settings = settings ?? new JsonSerializerSettings();        bool reset = (settings.ContractResolver == null);        if (reset) // To reduce memory footprint, do not cache contract information in the global contract resolver. settings.ContractResolver = new DefaultContractResolver();        try        { return JsonConvert.SerializeObject(obj, settings);        }        finally        { if (reset)     settings.ContractResolver = null;        }    }}

如果您使用

CamelCasePropertyNamesContractResolver
,请使用
DefaultContractResolver
适当的命名策略切换至,例如:

settings.ContractResolver = new DefaultContractResolver { NamingStrategy = new CamelCaseNamingStrategy() };

大部分缓存的协定内存( 但不是全部 )最终将被垃圾回收。当然,这样做 会严重影响序列化性能
。(某些表包含有关

enum
类型和数据协定属性的反映信息,这些表在全球范围内共享,因此不会被回收。)

有关更多信息,
请参阅Newtonsoft的性能提示:重用合同解析器。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/465631.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号