Я думаю, что нашел проблему.По умолчанию XmlSerializer
позволит вам генерировать недопустимый XML.
С учетом кода:
var input = "\u001a";
var writer = new StringWriter();
var serializer = new XmlSerializer(typeof(string));
serializer.Serialize(writer, input);
Console.WriteLine(writer.ToString());
Вывод:
<?xml version="1.0" encoding="utf-16"?>
<string></string>
Это недопустимый XML,Согласно спецификации XML все ссылки на символы должны быть действительными.Допустимые символы:
#x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]
Как видите, U + 001A (и все другие управляющие символы C0 / C1) не разрешены в качестве ссылок, поскольку они не являются допустимыми символами.
Сообщение об ошибке, выдаваемое декодером, немного вводит в заблуждение и будет более понятным, если будет сказано, что существует недопустимая ссылка на символ .
Существует несколько вариантовчто вы можете сделать.
1) Не позволяйте XmlSerializer создавать недопустимые документы в первую очередь
Вы можете использовать XmlWriter
, который по умолчанию не допускает недопустимые символы:
var input = "\u001a";
var writer = new StringWriter();
var serializer = new XmlSerializer(typeof(string));
// added following line:
var xmlWriter = XmlWriter.Create(writer);
// then, write via the xmlWriter rather than writer:
serializer.Serialize(xmlWriter, input);
Console.WriteLine(writer.ToString());
Это вызовет исключение при сериализации.Это нужно будет обработать и показать соответствующую ошибку.
Это, вероятно, бесполезно для вас, потому что у вас уже есть данные, хранящиеся с этими недопустимыми символами.
или 2) Удалите ссылки наэтот недопустимый символ
То есть вместо .Replace((char)0x1a, ' ')
, который на самом деле ничего не заменяет в вашем документе, используйте .Replace("", " ")
.(Это не учитывает регистр, но это то, что генерирует .NET. Более надежным решением было бы использование регулярного выражения без учета регистра.)
В стороне XML 1.1 фактически допускает ссылкиуправлять символами, если они являются ссылками, а не простыми символами в документе.Это решит вашу проблему, за исключением того факта, что .NET XmlSerializer не поддерживает версию 1.1.