【问题标题】:Xml serializing and deserializing with memory stream [duplicate]Xml用内存流序列化和反序列化[重复]
【发布时间】:2015-06-07 20:51:51
【问题描述】:

我收到以下代码的错误,它在尝试反序列化代码时找不到根元素:

System.Xml.dll 中出现“System.InvalidOperationException”类型的异常,但未在用户代码中处理
附加信息:XML 文档 (0, 0) 中存在错误。
内部异常:{“缺少根元素。”}

代码看起来很简单,但是在这个问题上搜索和搜索 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 对象并有不同的正确答案。

【问题讨论】:

  • 在序列化后尝试将 memorystreem 位置设置为零。或使用新的内存流
  • “我遇到错误”...什么错误?请具体。
  • "System.Xml.dll 中发生了 'System.InvalidOperationException' 类型的异常,但未在用户代码中处理附加信息:XML 文档 (0, 0) 中存在错误。"
  • 详细信息:{“XML 文档 (0, 0) 中有错误。”} 内部异常:{“缺少根元素。”}
  • 好。现在编辑您的问题并将该信息添加到其中。

标签: c# xml serialization


【解决方案1】:

序列化后,MemoryStream的位置> 0,读取前需要重置。

memStream.Position = 0;

或者……

memStream.Seek(0, SeekOrigin.Begin);

【讨论】:

  • 太棒了,感谢您的帮助——我没想到流的状态是问题所在。
【解决方案2】:

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

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

【讨论】:

  • 谢谢,我只是将第一个标记为正确回答,但这有帮助。
猜你喜欢
  • 2012-05-10
  • 2014-10-04
  • 2012-02-02
  • 2021-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多