XML反序列化失败

时间:2009-08-31 05:55:36

标签: c# .net xml xml-serialization

我正在反序列化以下XML文件。将XML序列化程序与VSTS 2008 + C#+ .Net 3.5一起使用。

这是XML文件。

<?xml version="1.0" encoding="utf-8"?>
<Person><Name>=b?olu</Name></Person>

以下是用于显示XML文件的屏幕快照和XML文件的二进制格式

alt text

alt text

如果有一些解决方案可以接受这样的角色,那就太棒了!由于我的XML文件很大,如果这些字符真的无效且应该被过滤,我希望在反序列化后保留XML文件的剩余内容。

目前,XML反序列化因InvalidOperationException而失败,整个XML文件信息将丢失。

实际上,当在VSTS中打开这个XML文件时,会出现这样的错误,错误1字符'?',十六进制值0xffff在XML文档中是非法的。我很困惑,因为在二进制形式中,没有0xffff值。

任何解决方案或想法?

EDIT1:这是我的代码,用于反序列化XML文件,

    static void Foo()
    {
        XmlSerializer s = new XmlSerializer(typeof(Person));
        StreamReader file = new StreamReader("bug.xml");
        s.Deserialize(file);
    }

public class Person
{
    public string Name;
}

3 个答案:

答案 0 :(得分:1)

这种风格有帮助吗?

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

或者encoding应该做的伎俩。

编辑:找到此页面:http://www.eggheadcafe.com/articles/system.xml.xmlserialization.asp。具体来说,这个反序列化代码:

public Object DeserializeObject(String pXmlizedString)
 {
     XmlSerializer xs = new XmlSerializer(typeof(Automobile));
     MemoryStream memoryStream = new MemoryStream(StringToUTF8ByteArray(pXmlizedString));
     XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8);
     return xs.Deserialize(memoryStream);
  } 

关于“StringToUTF8ByteArray”和“Encoding.UTF8”这一部分看起来很奇怪。我猜.NET不喜欢读取实际XML文件的编码......?

答案 1 :(得分:1)

您是否尝试过DataContractSerializer?我遇到了一个有趣的情况,当有人将一些单词或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的评论是关于DataContractSerializers习惯制作XmlElements而不是XmlAttributes:

<AnElement>value</AnElement> 

而不是

<AnElement AnAttribute="value" />

答案 2 :(得分:0)

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

您能否向本文档的发起人询问他们意味着包含在该位置的字符?也许问他们如何生成文件?

相关问题