{"id":36043,"date":"2008-01-18T15:06:54","date_gmt":"2008-01-18T15:06:54","guid":{"rendered":"https:\/\/blogs.msdn.microsoft.com\/andrewarnottms\/2008\/01\/18\/using-the-xmlserializer-as-an-xmlobjectserializer-with-wcf\/"},"modified":"2019-04-03T22:27:53","modified_gmt":"2019-04-04T05:27:53","slug":"using-the-xmlserializer-as-an-xmlobjectserializer-with-wcf","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/premier-developer\/using-the-xmlserializer-as-an-xmlobjectserializer-with-wcf\/","title":{"rendered":"Using the XmlSerializer as an XmlObjectSerializer with WCF"},"content":{"rendered":"<p>The Windows Communication Foundation introduced the new DataContractSerializer to replace the XmlSerializer in many scenarios.\u00a0 The DataContractSerializer is faster than the XmlSerializer, but has certain limitations.\u00a0 For example it does not support serializing an object&#8217;s members as XML attributes.\u00a0 When you write a WCF client that calls a service, WCF will generate a proxy class that defaults to using the DataContractSerializer and falls back to the XmlSerializer if the service uses features that the DataContractSerializer does not support.\u00a0 This fallback mechanism is automatic if you&#8217;re using WCF&#8217;s service model.<\/p>\n<p>But if you&#8217;re working at WCF&#8217;s messaging layer, you must explicitly choose which serializer to use.\u00a0 You can use any serializer that derives from <a href=\"http:\/\/msdn2.microsoft.com\/en-us\/library\/system.runtime.serialization.xmlobjectserializer.aspx\">System.Runtime.Serialization.XmlObjectSerializer<\/a>.\u00a0 <a href=\"http:\/\/msdn2.microsoft.com\/en-us\/library\/system.runtime.serialization.xmlobjectserializer.aspx\">System.Runtime.Serialization.DataContractSerializer<\/a> already derives from this class &#8212; but <a href=\"http:\/\/msdn2.microsoft.com\/en-us\/library\/system.xml.serialization.xmlserializer.aspx\">System.Xml.Serialization.XmlSerializer<\/a> does <em>not<\/em>.\u00a0 So you have some work to do before you can use the XmlSerializer as your serializer of choice at the messaging layer of WCF.<\/p>\n<p>In order to use the XmlSerializer to send messages with WCF, we have to define a class that derives from XmlObjectSerializer and uses the XmlSerializer internally.\u00a0 In essence we will create a wrapper class for the XmlSerializer that makes it look and work like an XmlObjectSerializer.\u00a0 XmlObjectSerializer is an abstract class with only a few methods we need to implement.<\/p>\n<p>Below is a sample of a class that will do just that.<\/p>\n<p><!-- code formatted by http:\/\/manoli.net\/csharpformat\/ --><\/p>\n<pre class=\"lang:default decode:true csharpcode \">&lt;span class=\"kwrd\"&gt;namespace&lt;\/span&gt; Microsoft.ServiceModel.Samples\r\n{\r\n    &lt;span class=\"kwrd\"&gt;using&lt;\/span&gt; System;\r\n    &lt;span class=\"kwrd\"&gt;using&lt;\/span&gt; System.Diagnostics;\r\n    &lt;span class=\"kwrd\"&gt;using&lt;\/span&gt; System.IO;\r\n    &lt;span class=\"kwrd\"&gt;using&lt;\/span&gt; System.Text;\r\n    &lt;span class=\"kwrd\"&gt;using&lt;\/span&gt; System.Xml;\r\n    &lt;span class=\"kwrd\"&gt;using&lt;\/span&gt; System.Xml.Serialization;\r\n    &lt;span class=\"kwrd\"&gt;using&lt;\/span&gt; System.Runtime.Serialization;\r\n\r\n    &lt;span class=\"kwrd\"&gt;public&lt;\/span&gt; &lt;span class=\"kwrd\"&gt;class&lt;\/span&gt; CFMessagingSerializer : XmlObjectSerializer\r\n    {\r\n        &lt;span class=\"kwrd\"&gt;readonly&lt;\/span&gt; Type objectType;\r\n        XmlSerializer serializer;\r\n\r\n        &lt;span class=\"kwrd\"&gt;public&lt;\/span&gt; CFMessagingSerializer(Type objectType)\r\n            : &lt;span class=\"kwrd\"&gt;this&lt;\/span&gt;(objectType, &lt;span class=\"kwrd\"&gt;null&lt;\/span&gt;, &lt;span class=\"kwrd\"&gt;null&lt;\/span&gt;)\r\n        {\r\n        }\r\n        \r\n        &lt;span class=\"kwrd\"&gt;public&lt;\/span&gt; CFMessagingSerializer(Type objectType, &lt;span class=\"kwrd\"&gt;string&lt;\/span&gt; wrapperName, &lt;span class=\"kwrd\"&gt;string&lt;\/span&gt; wrapperNamespace)\r\n        {\r\n            &lt;span class=\"kwrd\"&gt;if&lt;\/span&gt; (objectType == &lt;span class=\"kwrd\"&gt;null&lt;\/span&gt;)\r\n                &lt;span class=\"kwrd\"&gt;throw&lt;\/span&gt; &lt;span class=\"kwrd\"&gt;new&lt;\/span&gt; ArgumentNullException(&lt;span class=\"str\"&gt;\"objectType\"&lt;\/span&gt;);\r\n            &lt;span class=\"kwrd\"&gt;if&lt;\/span&gt; ((wrapperName == &lt;span class=\"kwrd\"&gt;null&lt;\/span&gt;) != (wrapperNamespace == &lt;span class=\"kwrd\"&gt;null&lt;\/span&gt;))\r\n                &lt;span class=\"kwrd\"&gt;throw&lt;\/span&gt; &lt;span class=\"kwrd\"&gt;new&lt;\/span&gt; ArgumentException(&lt;span class=\"str\"&gt;\"wrapperName and wrapperNamespace must be either both null or both non-null.\"&lt;\/span&gt;);\r\n            &lt;span class=\"kwrd\"&gt;if&lt;\/span&gt; (wrapperName == &lt;span class=\"kwrd\"&gt;string&lt;\/span&gt;.Empty)\r\n                &lt;span class=\"kwrd\"&gt;throw&lt;\/span&gt; &lt;span class=\"kwrd\"&gt;new&lt;\/span&gt; ArgumentException(&lt;span class=\"str\"&gt;\"Cannot be the empty string.\"&lt;\/span&gt;, &lt;span class=\"str\"&gt;\"wrapperName\"&lt;\/span&gt;);\r\n            \r\n            &lt;span class=\"kwrd\"&gt;this&lt;\/span&gt;.objectType = objectType;\r\n            &lt;span class=\"kwrd\"&gt;if&lt;\/span&gt; (wrapperName != &lt;span class=\"kwrd\"&gt;null&lt;\/span&gt;)\r\n            {\r\n                XmlRootAttribute root = &lt;span class=\"kwrd\"&gt;new&lt;\/span&gt; XmlRootAttribute(wrapperName);\r\n                root.Namespace = wrapperNamespace;\r\n                &lt;span class=\"kwrd\"&gt;this&lt;\/span&gt;.serializer = &lt;span class=\"kwrd\"&gt;new&lt;\/span&gt; XmlSerializer(objectType, root);\r\n            }\r\n            &lt;span class=\"kwrd\"&gt;else&lt;\/span&gt;\r\n                &lt;span class=\"kwrd\"&gt;this&lt;\/span&gt;.serializer = &lt;span class=\"kwrd\"&gt;new&lt;\/span&gt; XmlSerializer(objectType);\r\n        }\r\n\r\n        &lt;span class=\"kwrd\"&gt;public&lt;\/span&gt; &lt;span class=\"kwrd\"&gt;override&lt;\/span&gt; &lt;span class=\"kwrd\"&gt;bool&lt;\/span&gt; IsStartObject(XmlDictionaryReader reader)\r\n        {\r\n            &lt;span class=\"kwrd\"&gt;throw&lt;\/span&gt; &lt;span class=\"kwrd\"&gt;new&lt;\/span&gt; NotImplementedException();\r\n        }\r\n\r\n        &lt;span class=\"kwrd\"&gt;public&lt;\/span&gt; &lt;span class=\"kwrd\"&gt;override&lt;\/span&gt; &lt;span class=\"kwrd\"&gt;object&lt;\/span&gt; ReadObject(XmlDictionaryReader reader, &lt;span class=\"kwrd\"&gt;bool&lt;\/span&gt; verifyObjectName)\r\n        {\r\n            Debug.Assert(serializer != &lt;span class=\"kwrd\"&gt;null&lt;\/span&gt;);\r\n            &lt;span class=\"kwrd\"&gt;if&lt;\/span&gt; (reader == &lt;span class=\"kwrd\"&gt;null&lt;\/span&gt;) &lt;span class=\"kwrd\"&gt;throw&lt;\/span&gt; &lt;span class=\"kwrd\"&gt;new&lt;\/span&gt; ArgumentNullException(&lt;span class=\"str\"&gt;\"reader\"&lt;\/span&gt;);\r\n            &lt;span class=\"kwrd\"&gt;if&lt;\/span&gt; (!verifyObjectName)\r\n                &lt;span class=\"kwrd\"&gt;throw&lt;\/span&gt; &lt;span class=\"kwrd\"&gt;new&lt;\/span&gt; NotSupportedException();\r\n\r\n            &lt;span class=\"kwrd\"&gt;return&lt;\/span&gt; serializer.Deserialize(reader);\r\n        }\r\n        \r\n        &lt;span class=\"kwrd\"&gt;public&lt;\/span&gt; &lt;span class=\"kwrd\"&gt;override&lt;\/span&gt; &lt;span class=\"kwrd\"&gt;void&lt;\/span&gt; WriteStartObject(XmlDictionaryWriter writer, &lt;span class=\"kwrd\"&gt;object&lt;\/span&gt; graph)\r\n        {\r\n            &lt;span class=\"kwrd\"&gt;throw&lt;\/span&gt; &lt;span class=\"kwrd\"&gt;new&lt;\/span&gt; NotImplementedException();\r\n        }\r\n\r\n        &lt;span class=\"kwrd\"&gt;public&lt;\/span&gt; &lt;span class=\"kwrd\"&gt;override&lt;\/span&gt; &lt;span class=\"kwrd\"&gt;void&lt;\/span&gt; WriteObjectContent(XmlDictionaryWriter writer, &lt;span class=\"kwrd\"&gt;object&lt;\/span&gt; graph)\r\n        {\r\n            &lt;span class=\"kwrd\"&gt;if&lt;\/span&gt; (writer == &lt;span class=\"kwrd\"&gt;null&lt;\/span&gt;) &lt;span class=\"kwrd\"&gt;throw&lt;\/span&gt; &lt;span class=\"kwrd\"&gt;new&lt;\/span&gt; ArgumentNullException(&lt;span class=\"str\"&gt;\"writer\"&lt;\/span&gt;);\r\n            &lt;span class=\"kwrd\"&gt;if&lt;\/span&gt; (writer.WriteState != WriteState.Element)\r\n                &lt;span class=\"kwrd\"&gt;throw&lt;\/span&gt; &lt;span class=\"kwrd\"&gt;new&lt;\/span&gt; SerializationException(&lt;span class=\"kwrd\"&gt;string&lt;\/span&gt;.Format(&lt;span class=\"str\"&gt;\"WriteState '{0}' not valid. Caller must write start element before serializing in contentOnly mode.\"&lt;\/span&gt;,\r\n                    writer.WriteState));\r\n            &lt;span class=\"kwrd\"&gt;using&lt;\/span&gt; (MemoryStream memoryStream = &lt;span class=\"kwrd\"&gt;new&lt;\/span&gt; MemoryStream())\r\n            {\r\n                &lt;span class=\"kwrd\"&gt;using&lt;\/span&gt; (XmlDictionaryWriter bufferWriter = XmlDictionaryWriter.CreateTextWriter(memoryStream, Encoding.UTF8))\r\n                {\r\n                    serializer.Serialize(bufferWriter, graph);\r\n                    bufferWriter.Flush();\r\n                    memoryStream.Position = 0;\r\n                    &lt;span class=\"kwrd\"&gt;using&lt;\/span&gt; (XmlReader reader = &lt;span class=\"kwrd\"&gt;new&lt;\/span&gt; XmlTextReader(memoryStream))\r\n                    {\r\n                        reader.MoveToContent();\r\n                        writer.WriteAttributes(reader, &lt;span class=\"kwrd\"&gt;false&lt;\/span&gt;);\r\n                        &lt;span class=\"kwrd\"&gt;if&lt;\/span&gt; (reader.Read()) &lt;span class=\"rem\"&gt;\/\/ move off start node (we want to skip it)&lt;\/span&gt;\r\n                        {\r\n                            &lt;span class=\"kwrd\"&gt;while&lt;\/span&gt; (reader.NodeType != XmlNodeType.EndElement) &lt;span class=\"rem\"&gt;\/\/ also skip end node.&lt;\/span&gt;\r\n                                writer.WriteNode(reader, &lt;span class=\"kwrd\"&gt;false&lt;\/span&gt;); &lt;span class=\"rem\"&gt;\/\/ this will take us to the start of the next child node, or the end node.&lt;\/span&gt;\r\n                            reader.ReadEndElement(); &lt;span class=\"rem\"&gt;\/\/ not necessary, but clean&lt;\/span&gt;\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        &lt;span class=\"kwrd\"&gt;public&lt;\/span&gt; &lt;span class=\"kwrd\"&gt;override&lt;\/span&gt; &lt;span class=\"kwrd\"&gt;void&lt;\/span&gt; WriteEndObject(XmlDictionaryWriter writer)\r\n        {\r\n            &lt;span class=\"kwrd\"&gt;throw&lt;\/span&gt; &lt;span class=\"kwrd\"&gt;new&lt;\/span&gt; NotImplementedException();\r\n        }\r\n        \r\n        &lt;span class=\"kwrd\"&gt;public&lt;\/span&gt; &lt;span class=\"kwrd\"&gt;override&lt;\/span&gt; &lt;span class=\"kwrd\"&gt;void&lt;\/span&gt; WriteObject(XmlDictionaryWriter writer, &lt;span class=\"kwrd\"&gt;object&lt;\/span&gt; graph)\r\n        {\r\n            Debug.Assert(serializer != &lt;span class=\"kwrd\"&gt;null&lt;\/span&gt;);\r\n            &lt;span class=\"kwrd\"&gt;if&lt;\/span&gt; (writer == &lt;span class=\"kwrd\"&gt;null&lt;\/span&gt;) &lt;span class=\"kwrd\"&gt;throw&lt;\/span&gt; &lt;span class=\"kwrd\"&gt;new&lt;\/span&gt; ArgumentNullException(&lt;span class=\"str\"&gt;\"writer\"&lt;\/span&gt;);\r\n            serializer.Serialize(writer, graph);\r\n        }\r\n    }\r\n}<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>The Windows Communication Foundation introduced the new DataContractSerializer to replace the XmlSerializer in many scenarios.\u00a0 The DataContractSerializer is faster than the XmlSerializer, but has certain limitations.\u00a0 For example it does not support serializing an object&#8217;s members as XML attributes.\u00a0 When you write a WCF client that calls a service, WCF will generate a proxy class [&hellip;]<\/p>\n","protected":false},"author":2685,"featured_media":37840,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[4617,3917,3918,383],"class_list":["post-36043","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-permierdev","tag-andarno","tag-mobile-devices","tag-netcf","tag-wcf"],"acf":[],"blog_post_summary":"<p>The Windows Communication Foundation introduced the new DataContractSerializer to replace the XmlSerializer in many scenarios.\u00a0 The DataContractSerializer is faster than the XmlSerializer, but has certain limitations.\u00a0 For example it does not support serializing an object&#8217;s members as XML attributes.\u00a0 When you write a WCF client that calls a service, WCF will generate a proxy class [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/premier-developer\/wp-json\/wp\/v2\/posts\/36043","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/premier-developer\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/premier-developer\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/premier-developer\/wp-json\/wp\/v2\/users\/2685"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/premier-developer\/wp-json\/wp\/v2\/comments?post=36043"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/premier-developer\/wp-json\/wp\/v2\/posts\/36043\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/premier-developer\/wp-json\/wp\/v2\/media\/37840"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/premier-developer\/wp-json\/wp\/v2\/media?parent=36043"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/premier-developer\/wp-json\/wp\/v2\/categories?post=36043"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/premier-developer\/wp-json\/wp\/v2\/tags?post=36043"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}