Note that there are some explanatory texts on larger screens.

plurals
  1. PORemoving namespaces for known types when serializing with DataContractSerializer
    primarykey
    data
    text
    <p>I have a dictionary class that implements IXmlSerializable with custom WriteXml and ReadXml implementation. (Full code below) When I serialize it using DataContractSerializer, the output contains namespaces for general known types such as int, long, string etc. As shown:</p> <pre><code>&lt;?xml version="1.0" encoding="utf-16"?&gt; &lt;MyDictionary&gt; &lt;DictionaryItem Key="myInteger"&gt; &lt;Value&gt; &lt;int xmlns="http://schemas.microsoft.com/2003/10/Serialization/"&gt;4&lt;/int&gt; &lt;/Value&gt; &lt;/DictionaryItem&gt; &lt;DictionaryItem Key="myLong"&gt; &lt;Value&gt; &lt;long xmlns="http://schemas.microsoft.com/2003/10/Serialization/"&gt;5&lt;/long&gt; &lt;/Value&gt; &lt;/DictionaryItem&gt; &lt;DictionaryItem Key="myString"&gt; &lt;Value&gt; &lt;string xmlns="http://schemas.microsoft.com/2003/10/Serialization/"&gt;testing&lt;/string&gt; &lt;/Value&gt; &lt;/DictionaryItem&gt; &lt;/MyDictionary&gt; </code></pre> <p>How can I remove it so that it looks like the below? Thanks!</p> <pre><code>&lt;?xml version="1.0" encoding="utf-16"?&gt; &lt;MyDictionary&gt; &lt;DictionaryItem Key="myInteger"&gt; &lt;Value&gt; &lt;int&gt;4&lt;/int&gt; &lt;/Value&gt; &lt;/DictionaryItem&gt; &lt;DictionaryItem Key="myLong"&gt; &lt;Value&gt; &lt;long&gt;5&lt;/long&gt; &lt;/Value&gt; &lt;/DictionaryItem&gt; &lt;DictionaryItem Key="myString"&gt; &lt;Value&gt; &lt;string&gt;testing&lt;/string&gt; &lt;/Value&gt; &lt;/DictionaryItem&gt; &lt;/MyDictionary&gt; </code></pre> <p>The test code I used to create the output:</p> <pre><code>private void button1_Click(object sender, EventArgs e) { MyDictionary myDictionary = new MyDictionary(); myDictionary.Add("myInteger", 4); Int64 myLong = 5; myDictionary.Add("myLong", myLong); myDictionary.Add("myString", "testing"); string outputXml = GetXmlForObject(myDictionary); System.IO.File.WriteAllText(@"C:\outputXml.txt", outputXml); } public static string GetXmlForObject(Object obj) { try { DataContractSerializer serializer = new DataContractSerializer(obj.GetType()); StringBuilder builder = new StringBuilder(); XmlWriterSettings xmlWriterSettings = new XmlWriterSettings(); xmlWriterSettings.NamespaceHandling = NamespaceHandling.OmitDuplicates; xmlWriterSettings.Indent = true; using (XmlWriter writer = XmlWriter.Create(builder, xmlWriterSettings)) { serializer.WriteObject(writer, obj); } return builder.ToString(); } catch (Exception exception) { return String.Empty; } } </code></pre> <p>Full code below:</p> <pre><code>[XmlRoot(Namespace = "")] public class MyDictionary : Dictionary&lt;String, Object&gt;, IXmlSerializable, ISerializable { public System.Xml.Schema.XmlSchema GetSchema() { throw new NotImplementedException("The method is not implemented."); } public void ReadXml(System.Xml.XmlReader reader) { try { string key = null; object value = null; if (reader.IsStartElement() &amp;&amp; !reader.IsEmptyElement) { reader.ReadStartElement(); while (reader.NodeType != XmlNodeType.EndElement) { key = reader.GetAttribute("Key"); string typeAttribute = reader.GetAttribute("Null"); reader.ReadStartElement("DictionaryItem"); if (reader.IsEmptyElement) { this.Add(key, null); reader.ReadStartElement(); } else { reader.ReadStartElement("Value"); value = GetValueDeserializer(reader.LocalName).ReadObject(reader.ReadSubtree()); this.Add(key, value); reader.Skip(); // skipping in case the string is empty or null reader.ReadEndElement(); // Reading end node for Value } reader.ReadEndElement(); // Reading end node for element in the list } reader.ReadEndElement(); } } catch (XmlException e) { throw new XmlException("ReadXml(XmlReader) reader pointing to invalid element", e); } } private DataContractSerializer GetValueDeserializer(string typeStr) { Type valueType = GetTypeFromStratusType(typeStr); return new DataContractSerializer(valueType); } public static Type GetTypeFromStratusType(string typeStr) { Type valueType; switch (typeStr) { case "short": valueType = typeof(Int16); break; case "int": valueType = typeof(Int32); break; case "long": valueType = typeof(Int64); break; case "string": valueType = typeof(String); break; default: valueType = typeof(String); break; } return valueType; } public void WriteXml(System.Xml.XmlWriter writer) { foreach (KeyValuePair&lt;String, Object&gt; item in this) { writer.WriteStartElement("DictionaryItem"); writer.WriteAttributeString("Key", item.Key.ToString()); if (item.Value != null) { writer.WriteStartElement("Value"); DataContractSerializer serializer = new DataContractSerializer(item.Value.GetType()); serializer.WriteObject(writer, item.Value); } else { writer.WriteStartElement("Value"); } writer.WriteEndElement(); writer.WriteEndElement(); } } } </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload