使用内存流进行Xml序列化和反序列化

8

在以下代码中,我遇到了一个错误,当代码尝试反序列化时找不到根元素:

'System.Xml.dll' 中发生了类型为 'System.InvalidOperationException' 的异常,但未在用户代码中处理
额外信息:XML 文档中有一个错误(0,0)。
内部异常:{"Root element is missing."}

代码看起来很简单,但在谷歌和搜索SO上查找这个问题并没有得出任何明确的答案,只有类似的问题,答案却不能帮助... 或者是我对某些事情的理解有误。

    [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; }
}

据称重复的问题 Root element is missing 使用了 XMLDocument 对象,并且有一个不同的正确答案。

2
"我遇到了一个错误" ...是什么错误?请具体说明。 - Lucas Trzesniewski
发生了类型为“System.InvalidOperationException”的异常,但在用户代码中未处理。附加信息:XML 文档(0, 0)中存在错误。 - Andy Isbell
细节:{"XML文档(0,0)中有一个错误。"} 内部异常:{"缺少根元素。"} - Andy Isbell
好的。现在编辑你的问题并添加这些信息。 - H H
@Dijkgraaf 但那个问题所接受的答案和问题本身是不同的。如果有人正在寻找解决我的问题的答案,他们不会去搜索其他提问者的问题... - Andy Isbell
显示剩余2条评论
2个回答

18

序列化后,MemoryStream的位置大于0。在从中读取之前,您需要将其重置。

memStream.Position = 0;

或者...

memStream.Seek(0, SeekOrigin.Begin);

太棒了,谢谢你的帮助——我没想到流的状态会是问题。 - Andy Isbell

2

在将XML序列化到MemoryStream后,您可能希望重置它的位置,因为位置将位于结尾。

memStream.Position = 0;
XmlSerializer = new XmlSerializer(testObject.GetType());
TestObject testObj = ((TestObject)xmlSerialzer.Deserialize(memStream));

谢谢,我只是标记了第一个回答正确的人,但这个也有帮助。 - Andy Isbell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接