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);
Предметы" это просто небольшой класс, автоматически сгенерированный xsd / c Items.xsd. Items.xsd - это не более чем корневой элемент (Items), содержащий один дочерний элемент (Item):
Ошибка, возникающая при десериализации,
Необработанное исключение: System.InvalidOperationException: в документе XML есть ошибка (3, 12). ---> System.Xml.XmlException: '♂'шестнадцатеричное значение 0x0B является недопустимым символом. Строка 3, позиция 12.
Сериализованный XML-файл содержит в строке 3 это:
hello world
Я знаю \ v -> & # xB; является недопустимым символом, но почему XMLSerialize позволяет сериализовать его (без ошибок)? Я нахожу несовместимым с .NET то, что он позволяет мне сериализовать что-то без проблем, только чтобы обнаружить, что я не могу десериализовать это.
Есть ли решение, чтобы либо XMLSerializer автоматически удалял недопустимые символы перед сериализацией, либо я могу дать команду десериализации игнорировать недопустимые символы?
В настоящее время я решаю это путем чтения содержимого файла в виде строки, заменяя "вручную" незаконные символы и затем десериализовать это ... но я считаю, что уродливый хак / обходной путь.