11

The most simple way I get ServiceStack xml deserialization to work is when the xml contains a namespace. However, the xml I receive do not contain namespaces. The most simple working example:

[Serializable]
public class test
{

}

class Program
{
   static void Main(string[] args)
   {
       string xml="<test xmlns=\"http://schemas.datacontract.org/2004/07/\"></test>";
       var result = ServiceStack.Text.XmlSerializer.DeserializeFromString<test>(xml);
   }
}

However, that is not what I want. I want the following to deserialize, since that is the xml I get from several services:

string xml="<test></test>";

But that gives me the following error:

DeserializeDataContract: Error converting type: Error in line 1 position 7. 
Expecting element 'test' from namespace 
'http://schemas.datacontract.org/2004/07/'.. 
Encountered 'Element'  with name 'test', namespace ''.

I tried:

[Serializable]
[XmlRoot("test", Namespace = "")]
public class test

I can't create a new Serializer, because ServiceStack.Text.XmlSerializer is static. I need to choose for either Microsoft XmlSerializer OR ServiceStack (not both). Meaning: if I can't get this simple example to work I need to skip an otherwise very useful part of the ServiceStack package. The last thing I want is to inject some dummy namespace in the incoming xml.

user247702
  • 23,641
  • 15
  • 110
  • 157
user1154148
  • 123
  • 1
  • 1
  • 8

1 Answers1

27

ServiceStack uses .NET's Xml DataContractSerializer to serialize XML to remove Namespaces you need to either set the Namespace to an empty string with:

[DataContract(Namespace="")]
public class test { ... }

But then you'll have to mark each property you want serialized with [DataMember] attributes. A better option is to specify an empty namespace for all types under a C# namespace by adding and Assembly attribute in your Assembly.cs file, e.g:

[assembly: ContractNamespace("", ClrNamespace = "MyServiceModel.DtoTypes")]

Note: you can remove the [Serializable] attribute - it's not used by any of ServiceStack's serializers. Also all XmlSerializer attributes like [XmlRoot] are useless since ServiceStack uses .NET's DataContractSerializer not Microsoft's earlier XmlSerializer.

mythz
  • 141,670
  • 29
  • 246
  • 390
  • Any reason that you didn't write your own XML deserializer? The Microsoft one seems to need just this type of magic sauce configuration to make it work, unlike your JSON serializer/deserializer, which just works. – JasonD Nov 02 '12 at 18:19
  • @JasonD Yeah I don't like NIH'ing without good reason and I prefer not to use XML. MS's XML DCS is also quite performant for XML, there is little benefit for the amount of effort it would've required. – mythz Nov 02 '12 at 19:03