C# XML反序列化失败

C# XML反序列化失败,c#,.net,xml,xml-serialization,C#,.net,Xml,Xml Serialization,我正在反序列化以下XML文件。将XML序列化程序与VSTS2008+C++.NET3.5一起使用 这是XML文件 <?xml version="1.0" encoding="utf-8"?> <Person><Name>=b?olu</Name></Person> 这种款式有用吗 <name> <![CDATA[ =b?olu ]]> </name> 关于“StringToU

我正在反序列化以下XML文件。将XML序列化程序与VSTS2008+C++.NET3.5一起使用

这是XML文件

<?xml version="1.0" encoding="utf-8"?>
<Person><Name>=b?olu</Name></Person>
这种款式有用吗

<name>
   <![CDATA[
     =b?olu
   ]]>
</name>

关于“StringToUTF8ByteArray”和“Encoding.UTF8”的部分看起来奇怪地没有出现在你的文章中。我猜.NET不喜欢读取实际XML文件的编码

您尝试过DataContractSerializer吗?我遇到了一个有趣的情况,当有人将一些word或excel内容复制并粘贴到我的web应用程序中时:字符串包含一些无效的控制字符(例如垂直选项卡)。令我惊讶的是,在将它发送到WCF服务时,它被序列化了,甚至在请求它时,它会100%地读回原始内容。纯.net环境在这方面没有问题,因此我假设DataContractSerializer可以处理此类内容(但是这违反了XML规范)

我们有另一个Java客户端访问同一个服务-它在收到此记录时失败

[在我下面的评论中以丑陋的格式编辑]

试试这个:

DataContractSerializer serializer = new DataContractSerializer(typeof(MyType));
using (XmlWriter xmlWriter = new XmlTextWriter(filePath, Encoding.UTF8)) 
{ 
  serializer.WriteObject(xmlWriter, instanceOfMyType);
}
using (XmlReader xmlReader = new XmlTextReader(filePath))
{
  MyType = serializer.ReadObject(xmlReader) as MyType;
}
第二个Marc的评论是关于DataContractSerializer使用XmlElements而不是XmlAttributes的习惯:

<AnElement>value</AnElement> 
而不是

<AnElement AnAttribute="value" />

这些“无效字符”看起来可能是编码为Unicode字符。也许他们使用了错误的编码


你能问一下这份文件的发起者,他们打算在那个位置包含什么字符吗?也许会问他们是如何生成文档的?

您是否也可以发布用于反序列化xml的代码?发布了,还有其他想法吗?:-)George,始终发布完整的异常:ex.ToString()的输出。感谢Glenn,问题是XML文件是我的应用程序输入,我无法以任何方式更改它。我需要找到一种方法来过滤掉无效字符,并继续解析(反序列化)剩余的字符。如果有一些方法可以接受这样的字符,它会更大!听起来您需要一个SAX解析器(),或者您需要自己预处理XML,并使用正则表达式或类似的方法对问题字符进行剥离/编码。您可能需要仔细研究一个正则表达式示例。我对它还不够熟悉,所以这里没有给出一个。哦,对了,即使使用SAX解析器,您仍然需要清理字符。在XML序列化期间捕获InvalidOperationException以检查XML文件是否有效是一个好的解决方案?或者不是一个好的解决方案?捕获异常不是一个好的解决方案,因为它不允许您继续解析。您的XML无效。所以你需要以某种方式对它进行预处理。哪个更难?将文件作为文本加载、预处理,然后加载XML,或者更改原始源以生成有效的XML?但我没有使用WCF,我可以使用DataContractSerializer吗?Marc,“数据不涉及属性”是什么意思?您能在这里展示一个示例吗?您好Dabblernl,您提到--“只需阅读文档”,但我没有找到您提到的任何URL链接或文档标题,如果您能推荐我阅读文档,我将不胜感激。请尝试以下操作:DataContractSerializer serializer=new DataContractSerializer(typeof(MyType));使用(XmlWriter XmlWriter=new XmlTextWriter(filePath,Encoding.UTF8)){serializer.WriteObject(XmlWriter,instanceOfMyType);}使用(XmlReader XmlReader=new XmlTextReader(filePath)){MyType=serializer.ReadObject(XmlReader)作为MyType;}第二个Marc的评论是关于DataContractSerializer习惯于使用XmlElements而不是XmlAttributes(value而不是)
<AnElement>value</AnElement> 
<AnElement AnAttribute="value" />