XML (де) сериализация недопустимая строка несовместима в C #?
В 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 - это не более чем корневой элемент (Items), содержащий один дочерний элемент (Item):
<?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 автоматически удалял недопустимые символы перед сериализацией, либо я могу дать команду десериализации игнорировать недопустимые символы?
В настоящее время я решаю эту проблему, читая содержимое файла в виде строки, заменяя «вручную» недопустимые символы и затем десериализуя его ... но я считаю, что это отвратительный взлом.