Сериализация непечатаемого символа
следующий код;
var c = (char) 1;
var serializer = new XmlSerializer(typeof (string));
var writer = new StringWriter();
serializer.Serialize(writer, c.ToString());
var serialized = writer.ToString();
var dc = serializer.Deserialize(new StringReader(serialized));
вызывает это исключение в .NET 4.
недопустимое исключение операции-ошибка в XML-документе (2, 12). ", шестнадцатеричное значение 0x01, является недопустимым знаком. Строка 2, позиция 12
Я делаю что-то не так? Или есть разумная работа вокруг?
большое спасибо!
2 ответов
есть обходной путь, как пояснил, что - вы можете использовать XmlReaderSettings.CheckCharacters
возможность игнорировать проверку символов:
XmlReader xr = XmlReader.Create(new StringReader(serialized),
new XmlReaderSettings { CheckCharacters = false });
var dc = (string)serializer.Deserialize(xr);
вы пытаетесь сериализовать символы, которые не могут быть представлены в XML. К сожалению, они нарушают сериализацию XML. Я не знаю никаких обходных путей для этого, кроме написания собственного кода побега.
с другой стороны, фактическое использование таких символов (ASCII - символы перед пробелом, кроме tab, возврата каретки и линейной подачи IIRC) относительно редко-вы можете найти, что вы в порядке, чтобы просто их удалить. Альтернативы придумать свой собственный побег, или кодировать вся строка в двоичном виде и base64 результат. Экранирование займет гораздо меньше места, чем подход к перекодировке:)