XML反序列化失败

问题描述 投票:2回答:3

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

这是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;
}
c# .net xml xml-serialization
3个回答
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
投票

您是否尝试过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" />

0
投票

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

你能问一下这个文件的创始人他们打算在那个地方包含什么字符?也许问他们如何生成文件?

© www.soinside.com 2019 - 2024. All rights reserved.