在 C#(.net 4.0 和 4.5 / vs2010 和 vs12)中,当我使用 XMLSerializer 序列化包含具有非法字符的字符串的对象时,不会引发错误。但是,当我反序列化该结果时,会引发“无效字符”错误。
// add to XML
Items items = new Items();
items.Item = "\v hello world"; // contains "illegal" character \v
// variables
System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(Items));
string tmpFile = Path.GetTempFileName();
// serialize
using (FileStream tmpFileStream = new FileStream(tmpFile, FileMode.Open, FileAccess.ReadWrite))
{
serializer.Serialize(tmpFileStream, items);
}
Console.WriteLine("Success! XML serialized in file " + tmpFile);
// deserialize
Items result = null;
using (FileStream plainTextFile = new FileStream(tmpFile, FileMode.Open, FileAccess.Read))
{
result = (Items)serializer.Deserialize(plainTextFile); //FAILS here
}
Console.WriteLine(result.Item);
“Items”只是一个由 xsd /c Items.xsd 自动生成的小类。Items.xsd 只不过是一个包含一个子元素(Item)的根元素(Items):
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="Items">
<xs:complexType>
<xs:sequence>
<xs:element name="Item" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
反序列化过程中抛出的错误是
未处理的异常:System.InvalidOperationException:XML 文档中存在错误 (3, 12)。---> System.Xml.XmlException: '♂',十六进制值 0x0B,是无效字符。第 3 行,位置 12。
序列化的 XML 文件在第 3 行包含以下内容:
<Item> hello world</Item>
我知道 \v -> & # xB; 是一个非法字符,但是为什么 XMLSerialize 允许它被序列化(没有错误)?我发现 .NET 不一致,它允许我毫无问题地序列化某些东西,只是发现我无法反序列化它。
是否有解决方案,以便 XMLSerializer 在序列化之前自动删除非法字符,或者我可以指示反序列化忽略非法字符吗?
目前我确实通过将文件内容作为字符串读取来解决它,“手动”替换非法字符然后反序列化它......但我发现这是一个丑陋的黑客/解决方法。