。我会尽我所能保持CodePlex上的这篇文章,源代码在sync.Introductionnbsp;
这是最小,最快的多态性JSON序列化,最小的,因为它只有25KB,编译时,最快的,因为大部分时间它(见性能测试部分)和多态,因为它可以在运行时序列化和反序列化以下情况正确,什么都反对你扔它:class animal { public string Name { get; set;} }
class cat: animal { public int legs { get; set;} }
class dog : animal { public bool tail { get; set;} }
class zoo { public List<animal> animals { get; set;} }
var zoo1 = new zoo();
zoo1.animals = new List<animal>();
zoo1.animals.Add(new cat());
zoo1.animals.Add(new dog());
这是一个很重要的一点,因为它简化了您的编码极大,是一个面向对象编程的基石,奇怪的几个序列化器处理这种情况下,甚至thenbsp。NETnbsp XmlSerializer的;不这样做,你有跳铁圈得到它的工作。此外,这是必须的,如果你要替换的BinaryFormatter的序列化其中大多数传输协议的应用中使用的,可以处理任何。NET对象结构(见我的WCF杀手文章)。什么和为什么的JSON
JSON(Java脚本对象符号)是一个文本或1999年左右人类可读的格式,由Douglas Crockford发明,主要是作为一个Web应用程序的数据交换格式(见{A})使用JSON作为内部存储格式。这implementationJust 3类2佣工的特点:$ typequot; codeJSON符合标准的1158线以下补充quot是用来表示对象的类型信息[Json.NET以及"schemaquot;是用来表示。 DataSet的架构信息"$ mapquot;用于处理后的运行时类型时,分配对象type.quot; $ typesquot;全局类型定义中使用的实例参考这本词典通过一个号码(类型减少JSON的大小NET 2.0中大量的嵌入式类型)工程,在下面的替代品清单一些实现至少需要NET 3.5Extremely小大小:25KB时compiledBlazingly快(见性能测试部分)可以动态创建typesHandles的GUID,数据集,词典,Hashtable和泛型列表的处理可空类型的处理字节数组为base64字符串处理objectsnbsp多态性集合;主题safenbsp; 处理值类型的数组(例如int []的char []等)处理泛型列表的值类型(如Listlt; intgt等) 处理的特殊情况Listlt;对象[] GT(批量数据传输的有用)处理嵌入式类(如Sales.Customer)处理多态对象类型的反序列化到原始类型(如对象ReturnEntity = GUID,数据集,ValueType的新的对象[] {object1,Object2的})[有线通信] NBSP需要;为JSON的较真序列化时,能够禁用扩展(如没有类型,输出地图) 能够反序列化标准JSON成一个类型,你给解串器,保证没有多态性。特殊情况进行了优化Dictionarylt输出字符串,stringgt;覆盖空值outputs.nbsp; properties.Datatable支持手柄XmlIgnore属性。通过IndentOutput property.nbsp齿痕JSON输出为Silverlight 4.0 NBSP支持; RegisterCustomType(用户)定义和非标准没有内置fastJSON(喜欢的TimeSpan,点等)的类型,必须通过此功能启用。 CUSTOMTYPE编译器指令,大约有1%的性能hit.You供应公共字段delegates.Added支持的串行器及解串器例程。如果日期结束quot;添加ShowReadOnlyProperties ReadOnly属性(默认为false =不会被输出)来控制输出自动UTC日期时间转换。Zquot;(JSON标准的)添加UseUTCDateTime属性来控制输出的UTC datetimes.Dictionarylt;字符串,GT;现在存储最佳千伏format.nbsp; Limitationsnbsp;目前无法反序列化值类型数组属性(例如int []的char []等)目前还不能处理多维数组。的Silverlight 4.0支持缺乏Hashtable时,数据集,数据表,因为它是不出来
在本节中我将讨论一些,我曾亲自使用的JSON替代品runtime.What的一部分。虽然我不能说这是一个全面的列表,但它展示了什么了there.XML
是最好的,如果你使用的是XML,那么就不要。它的速度太慢,臃肿,不值得作为第一件事,每个人都使用一个荣誉奖,但严重不。在此列表中的最慢的JSON慢的50倍以上。好处是,你可以从JSON easily.BinaryFormatter
可能最强大的格式转换为计算机到计算机的数据传输。它有一个相当不错的表现虽然有些实现在这里击败它。优点缺点可以处理任何一个Serializable属性itPretty紧凑输出版本不友好的:必须反序列化的确切类是序列化,因为版本problemNot人类readableNot以外的同一平台上的沟通(如双方必须。NET)Json.NET
没有良好的数据存储最引用的JSON序列化程序。NET框架是从()Json.NET。这是我在我自己的应用程序使用的第一个JSON的实施。优点缺点强大的输出,它可以处理datasetsFirst实施,我看到了它可以处理多态对象集合大型DLL的大小〜320kbSlow比较在listSource代码的其余部分是难以遵循,因为它是大LitJSON
我看周围很多寻找这种宝石(),这是0.5版以来2007。这是什么我是用我自己的实现之前,它取代了以前的的JSON序列化是Json.NET。诚然,我不得不改变了原来以适应上述要求。优点缺点可以做,Json.NET(我的变化后)。小型DLL的大小〜57KB较快没有处理原始的源代码(我写的事后我自己在自己的应用程序)的数据集的词法分析器类是很难followRequires NET 3.5(解决此限制了通过实施一个Linqbridge类与。NET 2.0)ServiceStack ()
序列化一个令人惊讶的快速JSON杰米斯贝洛特串行器。串行速度是惊人的,虽然它不支持的序列化的需要是什么。我已经包括在这里作为衡量性能的标准。赞成 缺点 令人惊讶的快速serializerPretty小DLL的大小〜91KB 关于数据集的Nullable typesFails无法处理多态对象collectionsRequires至少NET 3.5Fails失败其他quot; exoticquot;像字典类型,哈希表等微软JSON Serializernbsp;(V1.7更新)流行的需求
我以前的无知有关Microsoft JSON实施和感谢大家谁给我指出了这一点,我有这个here.Pros frameworkCan中包含的缺点基本多态性objectsCan't序列化反序列化多态对象数据集失败,失败对其他quot; exoticquot;像字典类型,哈希表等4倍的速度较慢,在使用代码
使用代码序列化fastJSON执行以下操作:// to serialize an object to string
string jsonText = fastJSON.JSON.Instance.ToJSON(c);
// to deserialize a string to an object
var newobj = fastJSON.JSON.Instance.ToObject(jsonText);
的主类是JSON,这是作为一个单身的实施,因此它可以缓存speed.nbsp信息的类型和财产; v1.7.5
添置添置v1.7.6 // you can set the defaults for the Instance which will be used for all calls
JSON.Instance.UseOptimizedDatasetSchema = true; // you can control the serializer dataset schema
JSON.Instance.UseFastGuid = true; // enable disable fast GUID serialization
JSON.Instance.UseSerializerExtension = true; // enable disable the $type and $map inn the output
// you can do the same as the above on a per call basis
public string ToJSON(object obj, bool enableSerializerExtensions)
public string ToJSON(object obj, bool enableSerializerExtensions, bool enableFastGuid)
public string ToJSON(object obj, bool enableSerializerExtensions, bool enableFastGuid, bool enableOptimizedDatasetSchema)
// Parse will give you a Dictionary<string,object> with ArrayList representation of the JSON input
public object Parse(string json)
// if you have disabled extensions or are getting JSON from other sources then you must specify
// the deserialization type in one of the following ways
public T ToObject<T>(string json)
public object ToObject(string json, Type type)
添置V1.8 JSON.Instance.SerializeNullValues = true; // enable disable null values to output
public string ToJSON(object obj, bool enableSerializerExtensions, bool enableFastGuid, bool enableOptimizedDatasetSchema, bool serializeNulls)
对于所有这些要求为什么会出现不支持类型quot; Xquot;,我已经实现了一个开放的封闭的主体延伸到fastJSON这可以让你实现你自己的例程不支持无类型通过代码
为了让这个扩展,你必须编译与CUSTOMTYPE编译器指令是一个性能命中与它相关的
性能Testsnbsp; public void main()
{
fastJSON.JSON.Instance.RegisterCustomType(typeof(TimeSpan), tsser, tsdes);
// do some work as normal
}
private static string tsser(object data)
{
return ((TimeSpan)data).Ticks.ToString();
}
private static object tsdes(string data)
{
return new TimeSpan(long.Parse(data))
}
下面的计算机上运行所有测试:AMD K625 1.5销售下进行3 GHz的Processor4Gb拉姆DDR2Windows 7家庭高级64bitWindows的3.9
测试评价是不同的。NET编译versions.NET 3.5。NET 4处理器类型设置为x86
处理器类型自动NET 4。 Excel中的屏幕截图以下是这些测试的结果与下面的说明:这些数字是经过时间(毫秒)。越红的背景越慢timesThe更多的绿色背景越快times.5测试每个serializer.The quot; AVGquot列最后4排除在第一次测试测试,这基本上是序列化设置的平均了其内部的缓存结构,时代处于关闭状态。 "; minquot;行的最低数量分别列在下面。 Json.NET串行器进行了测试,3.5r6和4.0r1的两个版本,这是当前one.quot; binquot; BinaryFormatter的测试reference.The测试结构是下面的代码,这是一种内在的5次循环1000 objects.Some数据类型的处理,从测试数据结构,使所有的序列化可以work.The测试代码模板
以下是基本的测试代码模板,你可以看到它是一个什么样的5测试循环我们要测试每个做的计数时间(1000次)。所用时间是写入到控制台选项卡格式化,所以你可以管到一个文件在Excel电子表格,以方便观看。
测试数据结构int count = 1000;
private static void fastjson_serialize()
{
Console.WriteLine();
Console.Write("fastjson serialize");
for (int tests = 0; tests < 5; tests++)
{
DateTime st = DateTime.Now;
colclass c;
string jsonText = null;
c = CreateObject();
for (int i = 0; i < count; i++)
{
jsonText = fastJSON.JSON.Instance.ToJSON(c);
}
Console.Write("\t" + DateTime.Now.Subtract(st).TotalMilliseconds + "\t");
}
}
测试数据显示多态的性质,我们要测试下面的类。 quot; colclassquot;这些数据结构的集合。在附带的源文件,如哈希表,字典,数据集等更多的外来数据结构。
。NET 3.5中序列[Serializable()]
public class baseclass
{
public string Name { get; set; }
public string Code { get; set; }
}
[Serializable()]
public class class1 : baseclass
{
public Guid guid { get; set; }
}
[Serializable()]
public class class2 : baseclass
{
public string description { get; set; }
}
[Serializable()]
public class colclass
{
public colclass()
{
items = new
List<baseclass>();
date = DateTime.Now;
multilineString = @"
AJKLjaskljLA
ahjksjkAHJKS
AJKHSKJhaksjhAHSJKa
AJKSHajkhsjkHKSJKash
ASJKhasjkKASJKahsjk
";
gggg = Guid.NewGuid();
//hash = new Hashtable();
isNew = true;
done= true;
}
public bool done { get; set; }
public DateTime date {get; set;}
//public DataSet ds { get; set; }
public string multilineString { get; set; }
public List<baseclass> items { get; set; }
public Guid gggg {get; set;}
public decimal? dec {get; set;}
public bool isNew { get; set; }
//public Hashtable hash { get; set; }
}
{S0} fastJSON是在这个测试中的第二位,比Stacks.fastJSON慢了近35%的保证金近2.9倍速度比二进制formatter.Json.NET的近1.9倍,是在新版本4.0r1对以前版本的慢3.5r6Json.NET v3.5r6是比二进制格式化快了近20%。 NET 3.5的Deserialize
fastJSON是在本次测试的首位,以10%的保证金堆。fastJSON是近4倍的速度比最接近的其他的JSON。 Json.NET近1.5倍的速度比其以前的版本3.5r6版本4.0r1 NET 4自动序列
{S2} fastJSON对Stacks.fastJSON近20%的保证金在本次测试的第一名,比二进制formatter.Json.NET v3.5r6二进制格式化看齐快近4.9x。 NET 4自动反序列化{S3} fastJSON首先是由11%的保证金。fastJSON比二进制formatter.Json.NET V4 1.5倍的速度比其以前的版本快1.7倍。 NET 4的x86序列{S4} fastJSON是对Stacks.fastJSON近21%的保证金在本次测试的第一名是4倍的速度比二进制formatter.Json.NET v3.5r6 1.7倍,比previuos版本更快.. NET 4中的x86的Deserialize{五} fastJSON是首位对Stacks.fastJSON 5%的保证金是1.7倍比二进制格式化这是third.Exotic数据型式试验
在本节我们将看到异国情调的数据类型,如数据集的性能测试结果快哈希表,字典等。 fastJSON和BinaryFormatter的,因为大多数其他序列化无法处理这些数据类型之间的比较。这些措施包括以下内容:DatasetsNullable类型HashtablesDictionaries
{中六} fastJSON是5倍的速度比在serializationfastJSON BinaryFormatter的20%以上deserializationDatasets BinaryFormatter的快了10 NBSP倍的性能杀手;性能ConclusionsfastJSON是在所有的测试速度更快,除非当下运行。NET 3.5中的堆栈速度只有35%(必须注意,堆栈不是多态的,不能处理所有类型的,所以它不是输出内部测试数据正确).. NET 4中的序列化速度更快比约15%在这些测试的。NET 3.5除fastJSON串行器快90%..您可以用fastJSON BinaryFormatter的一个巨大的性能提升(这个精益方式借给其自我压缩技术对文本输出也)。启动fastJSON成本平均2倍的速度比栈,速度始终高于人人else.nbsp; 性能结论V1.4
{七}
正如你可以看到从上面的图片V1.4 noticably快。即使在所有测试的速度提高fastJSON更快比SerializerStack,净v3.5.fastJSON串行器是比二进制一个dataset.nbsp更快的6.7x; fastJSON解串器是比二进制dataset.fastJSON串行器与快2.1倍,是6.9x比二进制快没有dataset.fastJSON解串器是1.6倍的速度比二进制无dataset.Performance结论V1.5
数字说话为自己fastJSON串行器6.65x没有DataSet和6.88x更快的速度比二进制,解串器是比二进制快2.7倍。在数量上的差异,这是比V1.4慢是在V1.5,V1.6
GUID快2倍,现在你可以恢复的base64编码,因为在枚举etc.Performance结论测试的额外的属性与UseFastGuid =虚假的JSON.InstanceDatasets旧式〜40%〜35%faster.fastJSON的序列化现在比解串器更快〜2.3倍的限制似乎2x.Performance结论V1.7
的int,long分析4X更快。 Unicode字符串优化,阅读和写作的非英文字符串faster.ChangeType方法optimizednbsp;词典optimizednbsp;使用Interestnbsp TryGetValuePoints;
我做了很多的性能调整与探查,这里是我的结果:始终使用StringBuilder,从未字符串邻接。切勿stringbuilder.append("string1的quot; string2quot),因为它杀死性能,取代两个StringBuilder的追加。这一点,吹我的脑海,在我的测试与profiler.Never,50%的速度给StringBuilder的一种能力的价值开始如VAR的StringBuilder =新的StringBuilder(4096);奇怪,但它是没有it.I试图取代一个MemoryStream的StringBuiler更快,但速度太慢(慢100%)。 最简单和最直接的方式可能是最快的,以及在反对词法分析器implementations.Always objects.HistoryInitial推出使用高速缓存的反射特性的点读值的情况下:二○一一年二月二十零日 更新V1.1 :26%的数据集反序列化的性能提升,纠正ServiceStack nameUpdate V1.2:System.DBNull序列化空,对数字的CultureInfo修复,ReadOnly属性,正确处理更新V1.3:移除未使用的代码(现在在780线),物业逗号fixUpdate V1.4:重优化(串行器3%,deserializernbsp;快50%,46%的速度更快的数据集序列化器,数据集的解串器快26%)[现在正式速度比即使在测试中所有的序列化程序ServiceStack NET 3.5。]更新V1。 5:重优化(解串器〜50%,比V1.4快),枚举修复,最大串行器Depth属性。西蒙休伊特特别感谢和学分在这个version.nbsp优化;更新V1.6:值类型数组handlednbsp; GUID快2倍的数据集〜40%的序列化器〜2%至11%,更快的解串器 6%至38%,更快的更新V1.7:增加了对微软测试新的异国情调typesbug修复字典deserializespecial情况下JSON evaluationadded consoletest项目下载处理Listlt;对象[] GT; 4X fasterunicode字符串int和长解析optimizechangetype optimizedictionary优化反序列化嵌入式类如Sales.Customer safedictionary检查处理前添加对象ReturnEntity =新对象[] {object1,Object2的处理对象ReturnEntity = GUID,数据集,valuetypeUpdate v1.7.5:没有extensionsoverloaded方法序列化序列化和deserializethe解串器的能力将竭尽所能来反序列化没有保证polymorphismnbsp带或不带扩展输入;更新v1.7.6:XmlIgnore处理:感谢帕特里克Oscarsson ideaspecial的情况下优化输出字符串字典,stringbug 0000 stringoverride修复今年1日期输出到输出序列空值:感谢再次PatrikUpdate v1.7.7:齿痕outputDatatable supportbug fixUpdate v1.7.7 Silverlight4:2011年6月4日当所有ok.Silverlight缺乏ArrayList中,数据集,DataTable中,Hashtable的支持,为silverlight4增加了一个新项目,目前在测试阶段,将新增主要邮编#如果silverlight4 support.nbsp源文件中的陈述;更新V1.8: 6月9日2011年合并为projectSeperate的Silverlight projectnbsp Silverlight代码; RegisterCustomType延长用户定义的序列化routinesCUSTOMTYPE编译directiveUpdate V1.9:2011年6月28日增加了市民支持fieldsUpdate v1.9.1:2011年6月30日固定一个可耻的错误,当SerializeNullValues = FALSE,特别感谢格兰特testingnbsp Birchmeier v1.9.2更新:2011年7月10日固定,以全名而不是名称搜索时,在属性缓存类型(namespace1.myclass ,namespace2.myclass现在不同)alex211bUpdate v1.9.3:2011年7月31 UTC通过UseUTCDateTime的datetime处理= true属性,以感谢mrkappa添加字典感谢作为重点给予支持枚举BirchmeierUpdate v1.9.4:2011年九月二十三日ShowReadOnlyProperties出口ReadOnly属性(默认= FALSE)如果datetime值结束quot; Zquot,然后自动UTC时间计算,如果使用UTC日期时间输出端在quot; Zquot;(符合标准)更新v1.9.6:2011年11月26日bug修复DataTable的架构序列放大器; deserializeadded美元全局类型定义类型的扩展,减少的想法输出JSON感谢马克霸业的大小添加UsingGlobalTypes配置用于控制上述(默认= TRUE)错误修复的DataTable逗号阵列之间和表定义(少皮棉抱怨)字符串键的字典序列化优化(不千伏格式)