Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Xml serializing and deserializing with memory stream [duplicate]

I'm getting an error with the following code where it can't find a root element when it tries to deserialize the code:

An exception of type 'System.InvalidOperationException' occurred in System.Xml.dll but was not handled in user code
Additional information: There is an error in XML document (0, 0).
Inner exception: {"Root element is missing."}

It seems straightforward enough code, but googling and searching SO on the issue hasn't yielded any clear answers--only similar issues that are nonetheless that the answer don't help... or I'm misunderstanding something.

    [TestMethod]
    public void TestSerialize()
    {
        XmlSerializer serializer = new XmlSerializer(testObject.GetType());
        MemoryStream memStream = new MemoryStream();
        serializer.Serialize(memStream, testObject);

        XmlSerializer xmlSerializer = new XmlSerializer(testObject.GetType());
        TestObject testObj = ((TestObject)xmlSerializer.Deserialize(memStream));
        assert(testObject == testObj);
    }

public class TestObject
{
    public int IntProp { get; set; }
    public string StringProp { get; set; }
}

The alleged duplicate question at Root element is missing uses XMLDocument objects and has a different correct answer.

like image 222
Andy Isbell Avatar asked Jun 07 '15 20:06

Andy Isbell


2 Answers

After serialization, the MemoryStream's position is > 0. You need to reset it before reading from it.

memStream.Position = 0;

Or...

memStream.Seek(0, SeekOrigin.Begin);
like image 83
glenebob Avatar answered Oct 26 '22 17:10

glenebob


You might want to reset the postition of your MemoryStream as after having serialized your XML to it the position will be at the end.

memStream.Position = 0;
XmlSerializer = new XmlSerializer(testObject.GetType());
TestObject testObj = ((TestObject)xmlSerialzer.Deserialize(memStream));
like image 36
Erik Karlstrand Avatar answered Oct 26 '22 17:10

Erik Karlstrand