7

我有一些 xml 文件,我试图在给定的代码中反序列化如下。

using (StreamReader srFileContent = new StreamReader(filePath))  
{
    XmlSerializer serializer = new XmlSerializer(typeof(messageType));   
    messageType objMessage = (messageType)serializer.Deserialize(srFileContent);  
}

此处位于 filePath 的文件不包含以下行

<?xml version="1.0"?>
<message xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">

这就是我收到错误的原因。你能帮我在反序列化给定文件的流之前如何在运行时添加这些行吗?

错误如下:

System.InvalidOperationException:XML 文档中存在错误 (2, 2)。---> System.InvalidOperationException:不是预期的。在 Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReadermessageType.‌​Read161_message() --- 内部异常堆栈跟踪结束 --- 在 System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events) 在 System .Xml.Serialization.XmlSerializer.Deserialize(TextReader textReader) 在 CCR2BB.frmMain.BWConvertProcess_DoWork()

4

3 回答 3

14

您将不得不查看基本异常以找出问题所在。捕获的异常可能包含 4 个或更多内部异常。

例如:

try
{
  ...
}
catch (Exception ex)
{
  Console.WriteLine(ex.GetBaseException());
}
于 2012-05-24T13:17:46.120 回答
4

另一个问题的解决方案是:

XmlRootAttribute xRoot = new XmlRootAttribute();
xRoot.ElementName = "message";
// xRoot.Namespace = "http://www.cpandl.com";
xRoot.IsNullable = true;

XmlSerializer xs = new XmlSerializer(typeof(messageType),xRoot);

也许这是解决您问题的一种方法。因为我的网络无法使用 MSDN,所以我无法为 XmlRootAttribute 提供更多文档。

于 2012-05-24T13:11:34.180 回答
0

您从哪里获得“messageType”类?

如果您使用 xsd.exe 为您的 xml 创建了 xsd,然后使用 xsd 您创建了此类。

然后您的项目将有两个包含此类的文件。

  • 其中一个文件designer.cs包含从类派生的DataSet此类
  • 一个文件只是一个.cs文件,它有一个部分类。
  • 当您在反序列化时使用此类时,它将引用来自 Designer.cs 的类,该类派生自DataSet.
  • 但是,如果您从项目中删除 Designer.cs,您的代码将引用 .cs 文件中的部分类。

通过删除这个类派生自的 Designer.cs 文件,DataSet我能够解决这个错误。

于 2012-05-24T14:07:27.320 回答