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
Deserialize from XmlDocument