.net – Serialize and Deserialize an XmlDocument in WCF using DataContractSerializer

netwcfxml

I have a WCF service which accepts a string as a paramter for one of its operation contracts. This string however has xml content in it.

I need to convert this into a class that is marked as a DataContract but is not exposed to the outside world.

I need to use the DataContractSerializer because the class members have the [DataMember] attribute set to a different name. Eg: the property Phone has the DataMember Name set as "Telephone", so when i deserialize the xmldocument using the normal serializer, i get an error as the deserializer looks for the Phone element which does not exist.

How do i de-serialize an XmlDocument using the DataContractSerializer? One constraint though is i cannot save the xmldocument to a file.

EDIT: Found an excellent article on serialization and de-serialization using DataContractSerializer here.

My client code:

string xmldata = "<Customer> + 
                System.Environment.NewLine+ 
                "<Age>1</Age>"+
                System.Environment.NewLine+
                "<BirthDate>1900-01-01T01:01:01.0000000-05:00</BirthDate>" + 
                System.Environment.NewLine+
                "<FistName>John</FistName>"+
                System.Environment.NewLine +
                "<LastName>Doe</LastName>" +
                System.Environment.NewLine +
                "</Customer>";

doc.LoadXml(xmldata); 
Service1Client a = new Service1Client();
a.GetData(doc.OuterXml.ToString());

My service code:

public string GetData(string per)
{
    string xmldata = per;
    XmlDocument xmlDoc = new XmlDocument();
    xmlDoc.LoadXml(xmldata);
    XmlDemo.Person a = Person.Create();

    DataContractSerializer ser = new DataContractSerializer(a.GetType());
    StringWriter stringWriter = new StringWriter();
    XmlTextWriter xmlWriter = new XmlTextWriter(stringWriter);
    xmlDoc.WriteTo(xmlWriter);

    MemoryStream stream = new MemoryStream(Encoding.ASCII.GetBytes(stringWriter.ToString()));
    stream.Position = 0;
    XmlDictionaryReader reader = XmlDictionaryReader.CreateTextReader(stream, new XmlDictionaryReaderQuotas());
    Person myContact = (Person)ser.ReadObject(reader, true);

    return string.Empty; 

}

My DataContract:

[Serializable]
[DataContract(Name = "Customer")]
public class Person
{
    private Person() {}
    [DataMember(Name = "FistName")]
    public string FName { get; set; }
    [DataMember(Name = "LastName")]
    public string LName { get; set; }
    [DataMember(Name = "Age")]
    public int Age { get; set; }
    [DataMember(Name = "BirthDate")]
    public DateTime DOB { get; set; }

    public static Person Create()
    {
        return new Person();
    }
}

I get this error at Person myContact = (Person)ser.ReadObject(reader, true);

Error in line 1 position 11. Expecting element 'Customer' from namespace 'http://schemas.datacontract.org/2004/07/XmlDemo'.. Encountered 'Element'  with name 'Customer', namespace ''.

Best Answer

Deserialize from string straight way

MemoryStream stream = new MemoryStream(Encoding.ASCII.GetBytes("<myXml />"));
stream.Position = 0;
XmlDictionaryReader reader = XmlDictionaryReader.CreateTextReader(stream, new XmlDictionaryReaderQuotas());
MyContact myContact = (MyContact)ser.ReadObject(reader, true);

Deserialize from XmlDocument

StringWriter stringWriter = new StringWriter();
XmlTextWriter xmlWriter = new XmlTextWriter(stringWriter);
xmlDoc.WriteTo(xmlWriter);

MemoryStream stream = new MemoryStream(Encoding.ASCII.GetBytes(stringWriter.ToString()));
stream.Position = 0;
XmlDictionaryReader reader = XmlDictionaryReader.CreateTextReader(stream, new XmlDictionaryReaderQuotas());
MyContact myContact = (MyContact)ser.ReadObject(reader, true);
Related Topic