Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using DataContractSerializer to serialize, but can't deserialize back

I have the following 2 functions:

public static string Serialize(object obj) {     DataContractSerializer serializer = new DataContractSerializer(obj.GetType());     MemoryStream memoryStream = new MemoryStream();     serializer.WriteObject(memoryStream, obj);     return Encoding.UTF8.GetString(memoryStream.GetBuffer()); }  public static object Deserialize(string xml, Type toType) {     MemoryStream memoryStream = new MemoryStream(Encoding.UTF8.GetBytes(xml));    // memoryStream.Position = 0L;     XmlDictionaryReader reader = XmlDictionaryReader.CreateTextReader(memoryStream, Encoding.UTF8, new XmlDictionaryReaderQuotas(), null);     DataContractSerializer dataContractSerializer = new DataContractSerializer(toType);     return dataContractSerializer.ReadObject(reader); } 

The first one seems to serialize an object to an xml string just fine. The XML appears valid, no broken tags, no white spaces at the beginning or at the end, etc. Now the second function doesn't want to deserialize my xml string back to the object. On the last line I get:

There was an error deserializing the object of type [MY OBJECT TYPE HERE]. The data at the root level is invalid. Line 1, position 1.

What am I doing wrong? I tried rewriting the Deserialize function a few times, and it always seems to be the same kind of error. Thank you!

Oh, and this is how I'm calling the 2 functions:

SomeObject so = new SomeObject(); string temp = SerializationManager.Serialize(so); so = (SomeObject)SerializationManager.Deserialize(temp, typeof(SomeObject)); 
like image 396
Dimskiy Avatar asked Feb 15 '11 22:02

Dimskiy


1 Answers

Here is how I've always done it:

    public static string Serialize(object obj) {         using(MemoryStream memoryStream = new MemoryStream())         using(StreamReader reader = new StreamReader(memoryStream)) {             DataContractSerializer serializer = new DataContractSerializer(obj.GetType());             serializer.WriteObject(memoryStream, obj);             memoryStream.Position = 0;             return reader.ReadToEnd();         }     }      public static object Deserialize(string xml, Type toType) {         using(Stream stream = new MemoryStream()) {             byte[] data = System.Text.Encoding.UTF8.GetBytes(xml);             stream.Write(data, 0, data.Length);             stream.Position = 0;             DataContractSerializer deserializer = new DataContractSerializer(toType);             return deserializer.ReadObject(stream);         }     } 
like image 87
Ray Vernagus Avatar answered Oct 05 '22 11:10

Ray Vernagus