<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.newtonking.com/~d/styles/itemcontent.css"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>James Newton-King</title><link>http://james.newtonking.com/default.aspx</link><description /><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP1 (Build: 31106.3070)</generator><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.newtonking.com/jamesnewtonking" type="application/rss+xml" /><item><title>OpenXmlDeveloper.org – An Introduction to the OpenXML SDK 2.0</title><link>http://feeds.newtonking.com/~r/jamesnewtonking/~3/eSUX1AEH58Y/openxmldeveloper-org-an-introduction-to-the-openxml-sdk-2-0.aspx</link><pubDate>Thu, 09 Jul 2009 06:29:50 GMT</pubDate><guid isPermaLink="false">bce7ef4a-1ab4-4a64-ae34-bb54d1362c7e:31749</guid><dc:creator>James Newton-King</dc:creator><slash:comments>0</slash:comments><comments>http://james.newtonking.com/archive/2009/07/08/openxmldeveloper-org-an-introduction-to-the-openxml-sdk-2-0.aspx#comments</comments><description>&lt;p&gt;Some time ago I wrote an article on version 2.0 of the OpenXML SDK, focusing on the tools that come with it to help you develop OpenXML applications.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Open XML Classes Explorer &lt;/li&gt;    &lt;li&gt;Open XML Diff &lt;/li&gt;    &lt;li&gt;Document Reflector &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a href="http://openxmldeveloper.com/articles/4730.aspx" target="_blank"&gt;Check it out yo.&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://openxmldeveloper.com/articles/4730.aspx" target="_blank"&gt;&lt;img title="Oh, loneliness and cheeseburgers are a dangerous mix. " style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="113" alt="Oh, loneliness and cheeseburgers are a dangerous mix. " src="http://james.newtonking.com/images/OpenXmlDeveloper.orgarticleAnIntroduct.0_10264/openxmldeveloperorg.png" width="517" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://james.newtonking.com/aggbug.aspx?PostID=31749" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/jamesnewtonking/~4/eSUX1AEH58Y" height="1" width="1"/&gt;</description><category domain="http://james.newtonking.com/archive/tags/.NET/default.aspx">.NET</category><category domain="http://james.newtonking.com/archive/tags/OpenXML/default.aspx">OpenXML</category><feedburner:origLink>http://james.newtonking.com/archive/2009/07/08/openxmldeveloper-org-an-introduction-to-the-openxml-sdk-2-0.aspx</feedburner:origLink></item><item><title>Json.NET 3.5 Beta 4 – JsonSerializer Improvements Part Deux</title><link>http://feeds.newtonking.com/~r/jamesnewtonking/~3/EGzuFECXRmw/json-net-3-5-beta-4-jsonserializer-improvements-part-deux.aspx</link><pubDate>Mon, 06 Jul 2009 09:57:33 GMT</pubDate><guid isPermaLink="false">bce7ef4a-1ab4-4a64-ae34-bb54d1362c7e:31738</guid><dc:creator>James Newton-King</dc:creator><slash:comments>0</slash:comments><comments>http://james.newtonking.com/archive/2009/07/06/json-net-3-5-beta-4-jsonserializer-improvements-part-deux.aspx#comments</comments><description>&lt;ol&gt;   &lt;li&gt;&lt;img style="border-right-width:0px;margin:0px 0px 5px 5px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Alice in Wonderland? Must be a rip off of Alice in Underpants" border="0" alt="Alice in Wonderland? Must be a rip off of Alice in Underpants" align="right" src="http://james.newtonking.com/images/Jso.5Beta4JsonSerializerImprovementsPart_F9B3/image.png" width="260" height="201" /&gt; Best. Serializer. Ever. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Gnomes_%28South_Park%29" target="_blank"&gt;???&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;Profit! &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&lt;strong&gt;JsonSerializer Improvements Part Deux&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;A huge amount has changed in the &lt;a href="http://james.newtonking.com/projects/json-net.aspx"&gt;Json.NET&lt;/a&gt; serializer since beta 3. As well as a general refactor (the JsonSerializer.cs file was pushing 1000 lines last release), tons and tons of new features have been added.&lt;/p&gt;  &lt;p&gt;New to the serializer is reference tracking, type tracking, serialization callback events, &lt;a href="http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.metadatatypeattribute.aspx" target="_blank"&gt;MetadataTypeAttribute&lt;/a&gt; support for when working with code generation, additional property level control over serialization settings, a BinaryConverter to convert byte arrays, a StringEnumConverter to convert enum values to their string name, a Populate method for populating JSON values onto an existing object, additional programmatic control over serialization via the IReferenceResolver interface (it replaces &lt;a href="http://james.newtonking.com/archive/2009/02/28/thoughts-on-improving-jsonserializer-imappingresolver.aspx"&gt;IMappingResolver&lt;/a&gt;), and much more…&lt;/p&gt;  &lt;p&gt;There is too much to cover in one blog post so I’m going to split everything up over a couple of weeks. If you’re really eager for the inside scoop then check out the &lt;a href="http://james.newtonking.com/projects/json/help/" target="_blank"&gt;Json.NET help&lt;/a&gt;.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://james.newtonking.com/projects/json/help/PreserveObjectReferences.html" target="_blank"&gt;Preserving Object References&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://james.newtonking.com/projects/json/help/SerializationCallbacks.html" target="_blank"&gt;Serialization Callbacks&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://james.newtonking.com/projects/json/help/CustomCreationConverter.html" target="_blank"&gt;CustomCreationConverter&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://james.newtonking.com/projects/json/help/ContractResolver.html" target="_blank"&gt;Contract Resolvers&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;I’m going to be adding more as I go. The first topic to be covered is my favourite new feature, one that very few serializers support and no JSON serializers anywhere as far as I know: Object reference tracking&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Preserving Object References&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;By default Json.NET will serialize all objects it encounters by value. If a list contains two Person references, and both references point to the same object then the JsonSerializer will write out all the names and values for each reference.&lt;/p&gt;  &lt;div class="overflowpanel"&gt;   &lt;div class="code"&gt;     &lt;div style="font-family:courier new;color:black;font-size:10pt;"&gt;       &lt;pre style="margin:0px;"&gt;&lt;span style="color:#2b91af;"&gt;Person&lt;/span&gt; p = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Person&lt;/span&gt;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160; {&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; BirthDate = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;DateTime&lt;/span&gt;(1980, 12, 23, 0, 0, 0, &lt;span style="color:#2b91af;"&gt;DateTimeKind&lt;/span&gt;.Utc),&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; LastModified = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;DateTime&lt;/span&gt;(2009, 2, 20, 12, 59, 21, &lt;span style="color:#2b91af;"&gt;DateTimeKind&lt;/span&gt;.Utc),&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; Name = &lt;span style="color:#a31515;"&gt;&amp;quot;James&amp;quot;&lt;/span&gt;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160; };&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&lt;span style="color:#2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Person&lt;/span&gt;&amp;gt; people = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Person&lt;/span&gt;&amp;gt;();&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;people.Add(p);&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;people.Add(p);&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;string&lt;/span&gt; json = &lt;span style="color:#2b91af;"&gt;JsonConvert&lt;/span&gt;.SerializeObject(people, &lt;span style="color:#2b91af;"&gt;Formatting&lt;/span&gt;.Indented);&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&lt;span style="color:green;"&gt;//[&lt;/span&gt;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&lt;span style="color:green;"&gt;//&amp;#160; {&lt;/span&gt;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&lt;span style="color:green;"&gt;//&amp;#160;&amp;#160;&amp;#160; &amp;quot;Name&amp;quot;: &amp;quot;James&amp;quot;,&lt;/span&gt;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&lt;span style="color:green;"&gt;//&amp;#160;&amp;#160;&amp;#160; &amp;quot;BirthDate&amp;quot;: &amp;quot;\/Date(346377600000)\/&amp;quot;,&lt;/span&gt;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&lt;span style="color:green;"&gt;//&amp;#160;&amp;#160;&amp;#160; &amp;quot;LastModified&amp;quot;: &amp;quot;\/Date(1235134761000)\/&amp;quot;&lt;/span&gt;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&lt;span style="color:green;"&gt;//&amp;#160; },&lt;/span&gt;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&lt;span style="color:green;"&gt;//&amp;#160; {&lt;/span&gt;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&lt;span style="color:green;"&gt;//&amp;#160;&amp;#160;&amp;#160; &amp;quot;Name&amp;quot;: &amp;quot;James&amp;quot;,&lt;/span&gt;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&lt;span style="color:green;"&gt;//&amp;#160;&amp;#160;&amp;#160; &amp;quot;BirthDate&amp;quot;: &amp;quot;\/Date(346377600000)\/&amp;quot;,&lt;/span&gt;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&lt;span style="color:green;"&gt;//&amp;#160;&amp;#160;&amp;#160; &amp;quot;LastModified&amp;quot;: &amp;quot;\/Date(1235134761000)\/&amp;quot;&lt;/span&gt;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&lt;span style="color:green;"&gt;//&amp;#160; }&lt;/span&gt;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&lt;span style="color:green;"&gt;//]&lt;/span&gt;&lt;/pre&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;In most cases this is the desired result but in certain scenarios writing the second item in the list as a reference to the first is a better solution. If the above JSON was deserialized now then the returned list would contain two completely separate Person objects with the same values. Writing references by value will also cause problems on objects where a circular reference occurs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PreserveReferencesHandling&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Settings PreserveReferencesHandling will track object references when serializing and deserializing JSON.&lt;/p&gt;

&lt;div class="overflowpanel"&gt;
  &lt;div class="code"&gt;
    &lt;div style="font-family:courier new;color:black;font-size:10pt;"&gt;
      &lt;pre style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;string&lt;/span&gt; json = &lt;span style="color:#2b91af;"&gt;JsonConvert&lt;/span&gt;.SerializeObject(people, &lt;span style="color:#2b91af;"&gt;Formatting&lt;/span&gt;.Indented,&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160; &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;JsonSerializerSettings&lt;/span&gt; { PreserveReferencesHandling = &lt;span style="color:#2b91af;"&gt;PreserveReferencesHandling&lt;/span&gt;.Objects });&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&lt;span style="color:green;"&gt;//[&lt;/span&gt;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&lt;span style="color:green;"&gt;//&amp;#160; {&lt;/span&gt;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&lt;span style="color:green;"&gt;//&amp;#160;&amp;#160;&amp;#160; &amp;quot;$id&amp;quot;: &amp;quot;1&amp;quot;,&lt;/span&gt;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&lt;span style="color:green;"&gt;//&amp;#160;&amp;#160;&amp;#160; &amp;quot;Name&amp;quot;: &amp;quot;James&amp;quot;,&lt;/span&gt;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&lt;span style="color:green;"&gt;//&amp;#160;&amp;#160;&amp;#160; &amp;quot;BirthDate&amp;quot;: &amp;quot;\/Date(346377600000)\/&amp;quot;,&lt;/span&gt;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&lt;span style="color:green;"&gt;//&amp;#160;&amp;#160;&amp;#160; &amp;quot;LastModified&amp;quot;: &amp;quot;\/Date(1235134761000)\/&amp;quot;&lt;/span&gt;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&lt;span style="color:green;"&gt;//&amp;#160; },&lt;/span&gt;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&lt;span style="color:green;"&gt;//&amp;#160; {&lt;/span&gt;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&lt;span style="color:green;"&gt;//&amp;#160;&amp;#160;&amp;#160; &amp;quot;$ref&amp;quot;: &amp;quot;1&amp;quot;&lt;/span&gt;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&lt;span style="color:green;"&gt;//&amp;#160; }&lt;/span&gt;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&lt;span style="color:green;"&gt;//]&lt;/span&gt;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&lt;span style="color:#2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Person&lt;/span&gt;&amp;gt; deserializedPeople = &lt;span style="color:#2b91af;"&gt;JsonConvert&lt;/span&gt;.DeserializeObject&amp;lt;&lt;span style="color:#2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Person&lt;/span&gt;&amp;gt;&amp;gt;(json,&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160; &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;JsonSerializerSettings&lt;/span&gt; { PreserveReferencesHandling = &lt;span style="color:#2b91af;"&gt;PreserveReferencesHandling&lt;/span&gt;.Objects });&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(deserializedPeople.Count);&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&lt;span style="color:green;"&gt;// 2&lt;/span&gt;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&lt;span style="color:#2b91af;"&gt;Person&lt;/span&gt; p1 = deserializedPeople[0];&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&lt;span style="color:#2b91af;"&gt;Person&lt;/span&gt; p2 = deserializedPeople[1];&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(p1.Name);&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&lt;span style="color:green;"&gt;// James&lt;/span&gt;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(p2.Name);&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&lt;span style="color:green;"&gt;// James&lt;/span&gt;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;bool&lt;/span&gt; equal = &lt;span style="color:#2b91af;"&gt;Object&lt;/span&gt;.ReferenceEquals(p1, p2);&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&lt;span style="color:green;"&gt;// true&lt;/span&gt;&lt;/pre&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;The first Person in the list is serizlied with the addition of an object Id. The second Person in JSON is now only a reference to the first.&lt;/p&gt;

&lt;p&gt;With PreserveReferencesHandling on now only one Person object is created on deserialization and the list contains two references to it, mirroring what we started with.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;IsReference on JsonObjectAttribute, JsonArrayAttribute and JsonPropertyAttribute&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The PreserveReferencesHandling setting on the JsonSerializer will change how all objects are serialized and deserialized. For fine grain control over which objects and members should be serialized there is the IsReference property on the JsonObjectAttribute, JsonArrayAttribute and JsonPropertyAttribute.&lt;/p&gt;

&lt;p&gt;Setting IsReference on JsonObjectAttribute or JsonArrayAttribute to true will mean the JsonSerializer will always serialize the type the attribute is against as a reference. Setting IsReference on the JsonPropertyAttribute to true will serialize only that property as a reference.&lt;/p&gt;

&lt;div class="overflowpanel"&gt;
  &lt;div class="code"&gt;
    &lt;div style="font-family:courier new;color:black;font-size:10pt;"&gt;
      &lt;pre style="margin:0px;"&gt;[&lt;span style="color:#2b91af;"&gt;JsonObject&lt;/span&gt;(IsReference = &lt;span style="color:blue;"&gt;true&lt;/span&gt;)]&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;EmployeeReference&lt;/span&gt;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;{&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; Name { &lt;span style="color:blue;"&gt;get&lt;/span&gt;; &lt;span style="color:blue;"&gt;set&lt;/span&gt;; }&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;EmployeeReference&lt;/span&gt; Manager { &lt;span style="color:blue;"&gt;get&lt;/span&gt;; &lt;span style="color:blue;"&gt;set&lt;/span&gt;; }&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;}&lt;/pre&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;IReferenceResolver&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To customize how references are generated and resolved the &lt;a href="http://james.newtonking.com/projects/json/help/html/T_Newtonsoft_Json_Serialization_IReferenceResolver.htm"&gt;IReferenceResolver&lt;/a&gt; interface is available to inherit from and use with the JsonSerializer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Changes&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here is a complete list of what has changed since Json.NET 3.5 Beta 3.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;New feature - Added StringEnumConverter to convert enum values to and from their string name rather than number value &lt;/li&gt;

  &lt;li&gt;New feature - Added BinaryConverter which converts byte array&amp;#39;s, Binary and SqlBinary values to and from base64 text. &lt;/li&gt;

  &lt;li&gt;New feature - Added NullValueHandling, DefaultValueHandling and ReferenceLoopHandling to JsonPropertyAttribute &lt;/li&gt;

  &lt;li&gt;New feature - Added MetadataTypeAttribute support when searching for attributes &lt;/li&gt;

  &lt;li&gt;New feature - JsonSerializer now looks for DataContractAttribute and DataMemberAttribute on a type &lt;/li&gt;

  &lt;li&gt;New feature - Now able to explicitly serialize private members when marked up with JsonPropertyAttribute or DataMemberAttribute &lt;/li&gt;

  &lt;li&gt;New feature - Added CustomCreationConverter. Used to customize creation of an object before the serializer populates values &lt;/li&gt;

  &lt;li&gt;New feature - Added Populate method to JsonSerializer. Pass existing object to serializer and have current object&amp;#39;s values populated onto it &lt;/li&gt;

  &lt;li&gt;New feature - Added IsReference to JsonContainerAttribute and JsonPropertyAttribute &lt;/li&gt;

  &lt;li&gt;New feature - Added PreserveReferencesHandling to JsonSerializer &lt;/li&gt;

  &lt;li&gt;New feature - Added IReferenceResolver (replacing IMappingResolver) to JsonSerializer &lt;/li&gt;

  &lt;li&gt;New feature - JsonObjectAttribute will now force a collection class to be serialized as an object &lt;/li&gt;

  &lt;li&gt;New feature - Added JsonContract, JsonObjectContract, JsonArrayContract and JsonDictionaryContract &lt;/li&gt;

  &lt;li&gt;New feature - Added support for OnSerializing, OnSerialized, OnDeserializing, OnDeserialized callback methods &lt;/li&gt;

  &lt;li&gt;Change - Rename JsonTokenReader, JsonTokenWriter, JsonTokenType to JTokenReader, JTokenWriter, JTokenType &lt;/li&gt;

  &lt;li&gt;Change - DefaultDateTimeFormat on IsoDateTimeConverter no longer displays milliseconds zeros &lt;/li&gt;

  &lt;li&gt;Change - JObject now enumerates over KeyValuePair&amp;lt;string, JToken&amp;gt; rather than JToken &lt;/li&gt;

  &lt;li&gt;Change - Moved serialize stack used to check for reference loops from JsonWriter (yuck) to JsonSerializerWriter (yay) &lt;/li&gt;

  &lt;li&gt;Change - Renamed JsonMemberMapping to JsonProperty &lt;/li&gt;

  &lt;li&gt;Fix - JToken now successfully casts to a float or decimal value &lt;/li&gt;

  &lt;li&gt;Fix - Serializer now handles comments encountered in JSON while deserializing &lt;/li&gt;

  &lt;li&gt;Fix - Fixed (hopefully) cache threading issues &lt;/li&gt;

  &lt;li&gt;Fix - Uri objects are now correctly serizlized on Silverlight/Compact Framework &lt;/li&gt;

  &lt;li&gt;Fix - Whole decimals will now always be written with a decimal place &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Links&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://json.codeplex.com/"&gt;&lt;strong&gt;Json.NET CodePlex Project&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://json.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=29756"&gt;&lt;strong&gt;Json.NET 3.5 Beta 4 Download&lt;/strong&gt;&lt;/a&gt; – Json.NET source code, documentation and binaries&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://james.newtonking.com/aggbug.aspx?PostID=31738" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/jamesnewtonking/~4/EGzuFECXRmw" height="1" width="1"/&gt;</description><feedburner:origLink>http://james.newtonking.com/archive/2009/07/06/json-net-3-5-beta-4-jsonserializer-improvements-part-deux.aspx</feedburner:origLink></item><item><title>Simple .NET Profanity Filter</title><link>http://feeds.newtonking.com/~r/jamesnewtonking/~3/203T_LisX8A/simple-net-profanity-filter.aspx</link><pubDate>Fri, 03 Jul 2009 10:27:04 GMT</pubDate><guid isPermaLink="false">bce7ef4a-1ab4-4a64-ae34-bb54d1362c7e:31727</guid><dc:creator>James Newton-King</dc:creator><slash:comments>14</slash:comments><comments>http://james.newtonking.com/archive/2009/07/03/simple-net-profanity-filter.aspx#comments</comments><description>&lt;p&gt;A website I am working on right now accepts public comments, and one of the requirements is to do a basic check for dirty language. Surprisingly for such a common problem I wasn’t able to find any code on the net that did what I wanted and so I’ve ended up writing my own.&lt;/p&gt;  &lt;p&gt;The Censor class is pretty simple: you give it a list of words you want to censor, either simple text or with wildcards, and the censor will star out any matches it finds.&lt;/p&gt;  &lt;div class="overflowpanel"&gt;   &lt;div class="code"&gt;     &lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&gt;       &lt;pre style="margin:0px;"&gt;&lt;span style="color:#2b91af;"&gt;IList&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;gt; censoredWords = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;gt;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;{&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160; &lt;span style="color:#a31515;"&gt;&amp;quot;gosh&amp;quot;&lt;/span&gt;,&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160; &lt;span style="color:#a31515;"&gt;&amp;quot;drat&amp;quot;&lt;/span&gt;,&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160; &lt;span style="color:#a31515;"&gt;&amp;quot;darn*&amp;quot;&lt;/span&gt;,&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;};&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&lt;span style="color:#2b91af;"&gt;Censor&lt;/span&gt; censor = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Censor&lt;/span&gt;(censoredWords);&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;string&lt;/span&gt; result;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;result = censor.CensorText(&lt;span style="color:#a31515;"&gt;&amp;quot;I stubbed my toe. Gosh it hurts!&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&lt;span style="color:green;"&gt;// I stubbed my toe. **** it hurts!&lt;/span&gt;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;result = censor.CensorText(&lt;span style="color:#a31515;"&gt;&amp;quot;The midrate on the USD -&amp;gt; EUR forex trade has soured my day. Drat!&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&lt;span style="color:green;"&gt;// The midrate on the USD -&amp;gt; EUR forex trade has soured my day. ****!&lt;/span&gt;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;result = censor.CensorText(&lt;span style="color:#a31515;"&gt;&amp;quot;Gosh darnit, my shoe laces are undone.&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&lt;span style="color:green;"&gt;// **** ******, my shoe laces are undone.&lt;/span&gt;&lt;/pre&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;The first example is a simple whole word match on gosh. The second example replaces drat but doesn’t star out the drat in midrate. The final example shows the censor starting out multiple matches and also matching darnit against the wildcard darn*.&lt;/p&gt;

&lt;p&gt;I’m passing a collection of strings in my examples but it is easy enough to find a list of swear words on the net, put them in a text file and call something like &lt;a href="http://msdn.microsoft.com/en-us/library/system.io.file.readalllines.aspx" target="_blank"&gt;File.GetAllLines&lt;/a&gt; to get an array of words to filter on.&lt;/p&gt;

&lt;p&gt;The code:&lt;/p&gt;

&lt;div class="overflowpanel"&gt;
  &lt;div class="code"&gt;
    &lt;div style="font-family:courier new;color:black;font-size:10pt;"&gt;
      &lt;pre style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Censor&lt;/span&gt;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;{&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;IList&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;gt; CensoredWords { &lt;span style="color:blue;"&gt;get&lt;/span&gt;; &lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;set&lt;/span&gt;; }&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; Censor(&lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;gt; censoredWords)&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160; {&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (censoredWords == &lt;span style="color:blue;"&gt;null&lt;/span&gt;)&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;throw&lt;/span&gt; &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ArgumentNullException&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;censoredWords&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; CensoredWords = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;gt;(censoredWords);&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160; }&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; CensorText(&lt;span style="color:blue;"&gt;string&lt;/span&gt; text)&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160; {&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (text == &lt;span style="color:blue;"&gt;null&lt;/span&gt;)&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;throw&lt;/span&gt; &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ArgumentNullException&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;text&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;string&lt;/span&gt; censoredText = text;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color:blue;"&gt;string&lt;/span&gt; censoredWord &lt;span style="color:blue;"&gt;in&lt;/span&gt; CensoredWords)&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;string&lt;/span&gt; regularExpression = ToRegexPattern(censoredWord);&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; censoredText = &lt;span style="color:#2b91af;"&gt;Regex&lt;/span&gt;.Replace(censoredText, regularExpression, StarCensoredMatch,&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#2b91af;"&gt;RegexOptions&lt;/span&gt;.IgnoreCase | &lt;span style="color:#2b91af;"&gt;RegexOptions&lt;/span&gt;.CultureInvariant);&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt; censoredText;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160; }&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160; &lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; StarCensoredMatch(&lt;span style="color:#2b91af;"&gt;Match&lt;/span&gt; m)&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160; {&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;string&lt;/span&gt; word = m.Captures[0].Value;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;, word.Length);&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160; }&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160; &lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; ToRegexPattern(&lt;span style="color:blue;"&gt;string&lt;/span&gt; wildcardSearch)&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160; {&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;string&lt;/span&gt; regexPattern = &lt;span style="color:#2b91af;"&gt;Regex&lt;/span&gt;.Escape(wildcardSearch);&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; regexPattern = regexPattern.Replace(&lt;span style="color:#a31515;"&gt;@&amp;quot;\*&amp;quot;&lt;/span&gt;, &lt;span style="color:#a31515;"&gt;&amp;quot;.*?&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; regexPattern = regexPattern.Replace(&lt;span style="color:#a31515;"&gt;@&amp;quot;\?&amp;quot;&lt;/span&gt;, &lt;span style="color:#a31515;"&gt;&amp;quot;.&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (regexPattern.StartsWith(&lt;span style="color:#a31515;"&gt;&amp;quot;.*?&amp;quot;&lt;/span&gt;))&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; regexPattern = regexPattern.Substring(3);&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; regexPattern = &lt;span style="color:#a31515;"&gt;@&amp;quot;(^\b)*?&amp;quot;&lt;/span&gt; + regexPattern;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; regexPattern = &lt;span style="color:#a31515;"&gt;@&amp;quot;\b&amp;quot;&lt;/span&gt; + regexPattern + &lt;span style="color:#a31515;"&gt;@&amp;quot;\b&amp;quot;&lt;/span&gt;;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt; regexPattern;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160; }&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;}&lt;/pre&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fjames.newtonking.com%2farchive%2f2009%2f07%2f03%2fsimple-net-profanity-filter.aspx"&gt;&lt;img border="0" alt="kick it on DotNetKicks.com" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fjames.newtonking.com%2farchive%2f2009%2f07%2f03%2fsimple-net-profanity-filter.aspx" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://james.newtonking.com/aggbug.aspx?PostID=31727" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/jamesnewtonking/~4/203T_LisX8A" height="1" width="1"/&gt;</description><category domain="http://james.newtonking.com/archive/tags/.NET/default.aspx">.NET</category><feedburner:origLink>http://james.newtonking.com/archive/2009/07/03/simple-net-profanity-filter.aspx</feedburner:origLink></item><item><title>.NET Ajax Survey 2009</title><link>http://feeds.newtonking.com/~r/jamesnewtonking/~3/m0cbPm6Rtkc/net-ajax-survey-2009.aspx</link><pubDate>Mon, 22 Jun 2009 21:57:32 GMT</pubDate><guid isPermaLink="false">bce7ef4a-1ab4-4a64-ae34-bb54d1362c7e:31716</guid><dc:creator>James Newton-King</dc:creator><slash:comments>2</slash:comments><comments>http://james.newtonking.com/archive/2009/06/22/net-ajax-survey-2009.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://codeclimber.net.nz/archive/2009/06/22/ajax-survey-2009-jquery-and-ms-ajax-are-almost-tied.aspx" target="_blank"&gt;Json.NET usage up 193%&lt;/a&gt; *&lt;/p&gt;  &lt;p&gt;&lt;img title="Mmm.... pi" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="246" alt="Mmm.... pi" src="http://james.newtonking.com/images/3e1aa72ea685.NETAjaxSurvey2009_8BF9/image.png" width="453" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;* &lt;a href="http://www.syringe.net.nz/" target="_blank"&gt;Chris&lt;/a&gt; immediately started to point out the statistical flaws of the survey. My response was that regardless, Json.NET’s share of the flawed survey market has increased &lt;img src="http://james.newtonking.com/emoticons/emotion-5.gif" alt="Wink" /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://james.newtonking.com/aggbug.aspx?PostID=31716" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/jamesnewtonking/~4/m0cbPm6Rtkc" height="1" width="1"/&gt;</description><category domain="http://james.newtonking.com/archive/tags/Json.NET/default.aspx">Json.NET</category><feedburner:origLink>http://james.newtonking.com/archive/2009/06/22/net-ajax-survey-2009.aspx</feedburner:origLink></item><item><title>Sunday Podcasts 2</title><link>http://feeds.newtonking.com/~r/jamesnewtonking/~3/ZxhNox_Bmjs/sunday-podcasts-2.aspx</link><pubDate>Sun, 21 Jun 2009 05:17:21 GMT</pubDate><guid isPermaLink="false">bce7ef4a-1ab4-4a64-ae34-bb54d1362c7e:31714</guid><dc:creator>James Newton-King</dc:creator><slash:comments>1</slash:comments><comments>http://james.newtonking.com/archive/2009/06/20/sunday-podcasts-2.aspx#comments</comments><description>&lt;p&gt;&lt;strong&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;margin-left:0px;border-top:0px;margin-right:0px;border-right:0px;" title="Remember, you can always find East by staring directly at the sun." border="0" alt="Remember, you can always find East by staring directly at the sun." align="right" src="http://james.newtonking.com/images/SundayPodcasts2_F305/podcast_logo.jpg" width="140" height="153" /&gt; This American Life&lt;/strong&gt; - &lt;a href="http://www.thislife.org/Radio_Episode.aspx?sched=1299" target="_blank"&gt;Classifieds&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.thislife.org" target="_blank"&gt;This American Life&lt;/a&gt; is a fantastic weekly podcast about everyday aspects of life. Each week’s show has a theme and then a number of stories around that theme.&lt;/p&gt;  &lt;p&gt;This episode is based on stories gathered from classified ads, all found from a single single newspaper on a single day. A man who posted an ad about a missing dog, a personnel ad to win back a lost love, and my favourite: assembling a disparate group of musicians from classified ads to form a band for one day only and record a song – Rocket Man.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://james.newtonking.com/downloads/music/Jon%20Langford%20and%20the%20One%20Day%20Band%20-%20Rocket%20Man.mp3" target="_blank"&gt;Jon Langford and the One Day Band - Rocket Man.mp3&lt;/a&gt;:&lt;/p&gt; &lt;object type="application/x-shockwave-flash" data="http://james.newtonking.com/flash/podango_player.swf" id="audioplayer1" height="24" width="290"&gt; &lt;param name="movie" value="http://james.newtonking.com/flash/podango_player.swf"&gt; &lt;param name="FlashVars" value="playerID=1&amp;amp;bg=0xF8F8F8&amp;amp;leftbg=0xEEEEEE&amp;amp;text=0x666666&amp;amp;lefticon=0x666666&amp;amp;rightbg=0xCCCCCC&amp;amp;rightbghover=0x999999&amp;amp;righticon=0x666666&amp;amp;righticonhover=0xFFFFFF&amp;amp;slider=0x666666&amp;amp;track=0xFFFFFF&amp;amp;loader=0x9FFFB8&amp;amp;border=0x666666&amp;amp;listen_wrapper=off&amp;amp;soundFile=http://james.newtonking.com/downloads/music/Jon Langford and the One Day Band - Rocket Man.mp3"&gt;  &lt;param name="quality" value="high"&gt; &lt;param name="menu" value="false"&gt; &lt;param name="wmode" value="transparent"&gt; &lt;/object&gt;  &lt;p&gt;&lt;strong&gt;Hanselminutes&lt;/strong&gt; – &lt;a href="http://www.hanselminutes.com/default.aspx?showID=176" target="_blank"&gt;Visiting Fog Creek Software and Joel Spolsky&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Scott Hanselman interviews Joel Spolsky about technology, business, blogging and shark jumping. I can’t say I agree with many of Spolsky’s opinions on programming (&lt;a href="http://www.joelonsoftware.com/items/2003/10/13.html" target="_blank"&gt;eww&lt;/a&gt;) but he has a good head for business and marketing.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;margin-left:0px;border-top:0px;margin-right:0px;border-right:0px;" title="I hope this has taught you kids a lesson: kids never learn." border="0" alt="I hope this has taught you kids a lesson: kids never learn." align="right" src="http://james.newtonking.com/images/SundayPodcasts2_F305/aardvark_thumb.png" width="340" height="132" /&gt; While Fog Creek is most known for a project management tool called Fogbuz they also have created a remote desktop service called Copilot. A DVD I brought not long after I started my first software development job is a documentary about Copilot called &lt;a href="http://www.projectaardvark.com/movie/" target="_blank"&gt;&lt;strong&gt;Aardvark&amp;#39;d: Twelve Weeks with Geeks&lt;/strong&gt;&lt;/a&gt;. Aardvark is a fun little movie about the software and the small group of interns who made it. Recommended.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://james.newtonking.com/aggbug.aspx?PostID=31714" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/jamesnewtonking/~4/ZxhNox_Bmjs" height="1" width="1"/&gt;</description><category domain="http://james.newtonking.com/archive/tags/Other/default.aspx">Other</category><category domain="http://james.newtonking.com/archive/tags/Interesting/default.aspx">Interesting</category><feedburner:origLink>http://james.newtonking.com/archive/2009/06/20/sunday-podcasts-2.aspx</feedburner:origLink></item></channel></rss>
