Files
Newtonsoft.Json/Doc/JsonNetVsDotNetSerializers.aml
2016-10-24 16:12:52 +13:00

504 lines
24 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<topic id="JsonNetVsDotNetSerializers" revisionNumber="1">
<developerConceptualDocument xmlns="http://ddue.schemas.microsoft.com/authoring/2003/5" xmlns:xlink="http://www.w3.org/1999/xlink">
<introduction>
<para>Json.NET offers many features not found in the JavaScriptSerializer and DataContractSerializer that come with .NET.</para>
<autoOutline lead="none" excludeRelatedTopics="true" />
</introduction>
<section address="FeatureComparison">
<title>Feature Comparison</title>
<content>
<table>
<tableHeader>
<row>
<entry><para></para></entry>
<entry><para>Json.NET</para></entry>
<entry><para>DataContractJsonSerializer</para></entry>
<entry><para>JavaScriptSerializer</para></entry>
</row>
</tableHeader>
<row>
<entry><para>Supports JSON</para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
</row>
<row>
<entry><para>Supports BSON</para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
</row>
<row>
<entry><para>Supports JSONPath</para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
</row>
<row>
<entry><para>Supports .NET 2.0</para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
</row>
<row>
<entry><para>Supports .NET 3.5</para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
</row>
<row>
<entry><para>Supports .NET 4.0</para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
</row>
<row>
<entry><para>Supports .NET 4.5</para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
</row>
<row>
<entry><para>Supports Silverlight</para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
</row>
<row>
<entry><para>Supports Windows Phone</para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
</row>
<row>
<entry><para>Supports Windows Store</para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
</row>
<row>
<entry><para>Supports Xamarin</para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
</row>
<row>
<entry><para>Open Source</para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
</row>
<row>
<entry><para>MIT License</para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
</row>
<row>
<entry><para>LINQ to JSON</para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
</row>
<row>
<entry><para>Thread Safe</para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
</row>
<row>
<entry><para>XPath-like JSON query syntax</para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
</row>
<row>
<entry><para>Indented JSON support</para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
</row>
<row>
<entry><para>
<externalLink>
<linkText>Efficient dictionary serialization</linkText>
<linkUri>http://stackoverflow.com/questions/1207731/how-can-i-deserialize-json-to-a-simple-dictionarystring-string-in-asp-net</linkUri>
<linkTarget>_blank</linkTarget>
</externalLink>
</para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
</row>
<row>
<entry><para>
<externalLink>
<linkText>Nonsensical dictionary serialization</linkText>
<linkUri>http://stackoverflow.com/questions/4559991/any-way-to-make-datacontractjsonserializer-serialize-dictionaries-properly</linkUri>
<linkTarget>_blank</linkTarget>
</externalLink>
</para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
</row>
<row>
<entry><para>Deserializes IList, IEnumerable, ICollection, IDictionary properties</para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
</row>
<row>
<entry><para>Serializes circular references</para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
</row>
<row>
<entry><para>Supports serializing objects by reference</para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
</row>
<row>
<entry><para>Deserializes polymorphic properties and collections</para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
</row>
<row>
<entry><para>Serializes and deserializes multidimensional arrays</para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
</row>
<row>
<entry><para>Supports including type names with JSON</para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
</row>
<row>
<entry><para>Globally customize serialization process</para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
</row>
<row>
<entry><para>Supports excluding null values when serializing</para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
</row>
<row>
<entry><para>Supports SerializationBinder</para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
</row>
<row>
<entry><para>Conditional property serialization</para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
</row>
<row>
<entry><para>Includes line number information in errors</para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
</row>
<row>
<entry><para>Converts XML to JSON and JSON to XML</para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
</row>
<row>
<entry><para>JSON Schema validation</para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
</row>
<row>
<entry><para>JSON Schema generation from .NET types</para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
</row>
<row>
<entry><para>Camel case JSON property names</para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
</row>
<row>
<entry><para>Non-default constructors support</para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
</row>
<row>
<entry><para>Serialization error handling</para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
</row>
<row>
<entry><para>Supports populating an existing object</para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
</row>
<row>
<entry><para>Efficiently serializes byte arrays as base64 text</para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
</row>
<row>
<entry><para>Handles NaN, Infinity, -Infinity and undefined</para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
</row>
<row>
<entry><para>Handles JavaScript constructors</para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
</row>
<row>
<entry><para>Serializes .NET 4.0 dynamic objects</para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
</row>
<row>
<entry><para>Serializes ISerializable objects</para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
</row>
<row>
<entry><para>Supports serializing enums to their text name</para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
</row>
<row>
<entry><para>JSON recursion limit support</para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
</row>
<row>
<entry><para>Attribute property name customization</para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
</row>
<row>
<entry><para>Attribute property order customization</para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
</row>
<row>
<entry><para>Attribute property required customization</para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
</row>
<row>
<entry><para>Supports ISO8601 dates</para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
</row>
<row>
<entry><para>Supports JavaScript constructor dates</para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
</row>
<row>
<entry><para>Supports Microsoft AJAX dates</para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
</row>
<row>
<entry><para>Unquoted property names support</para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
</row>
<row>
<entry><para>Raw JSON support</para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
</row>
<row>
<entry><para>Supports reading and writing comments</para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
</row>
<row>
<entry><para>Serializes anonymous types</para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
</row>
<row>
<entry><para>Deserializes anonymous types</para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
</row>
<row>
<entry><para>Opt-in mode serialization</para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
</row>
<row>
<entry><para>Opt-out mode serialization</para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
</row>
<row>
<entry><para>Field (Serializable) mode serialization</para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
</row>
<row>
<entry><para>Efficiently stream reading and writing JSON</para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
</row>
<row>
<entry><para>Single or double quote JSON content</para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
</row>
<row>
<entry><para>Supports overriding a type&apos;s serialization</para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
</row>
<row>
<entry><para>Supports OnDeserialized, OnSerializing, OnSerialized and OnDeserializing attributes</para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
</row>
<row>
<entry><para>Supports serializing private properties</para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
</row>
<row>
<entry><para>DataMember attribute support</para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
</row>
<row>
<entry><para>MetdataType attribute support</para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
</row>
<row>
<entry><para>DefaultValue attribute support</para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
</row>
<row>
<entry><para>Serializes DataSets and DataTables</para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
</row>
<row>
<entry><para>Serializes Entity Framework</para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
</row>
<row>
<entry><para>Serializes nHibernate</para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
</row>
<row>
<entry><para>Case-insensitive property deserialization</para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
</row>
<row>
<entry><para>Diagnostic tracing</para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
</row>
<row>
<entry><para>Serializes read-only and immutable collections</para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
</row>
<row>
<entry><para>Supports serialization extension data</para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
</row>
<row>
<entry><para>Serializes F# discriminated unions</para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
</row>
<row>
<entry><para>Serializes F# collections</para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
</row>
<row>
<entry><para>Supports merging JSON</para></entry>
<entry><para><markup><img src="../tick.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
<entry><para><markup><img src="../cross.png" /></markup></para></entry>
</row>
</table>
</content>
</section>
<section address="Benchmarks">
<title>Benchmarks</title>
<content>
<mediaLink>
<image class="image" xlink:href="performance" mimeType="image/png" width="643" height="345" />
<summary>Json.NET Performance</summary>
</mediaLink>
</content>
</section>
</developerConceptualDocument>
</topic>