XML deserializing only works with namespace in xml
Asked Answered
P

1

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.

Puttier answered 13/3, 2012 at 18:14 Comment(0)
A
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.

Adynamia answered 13/3, 2012 at 20:3 Comment(2)
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.Advocaat
@Advocaat 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.Adynamia

© 2022 - 2024 — McMap. All rights reserved.