Сериализация непечатаемого символа
Следующий код:
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
Я что-то делаю неправильно? Или есть разумная работа?
Большое спасибо!
Ответы
Ответ 1
Существует обходное решение здесь - вы можете использовать XmlReaderSettings.CheckCharacters
, чтобы игнорировать проверку символов:
XmlReader xr = XmlReader.Create(new StringReader(serialized),
new XmlReaderSettings { CheckCharacters = false });
var dc = (string)serializer.Deserialize(xr);
Ответ 2
Вы пытаетесь сериализовать символы, которые не могут быть представлены в XML. К сожалению, они прерывают сериализацию XML. Я не знаю никаких обходных путей для этого, кроме написания собственного кода экранирования.
С другой стороны, фактическое использование для таких символов (символы ASCII перед пробелом, кроме табуляции, возврата каретки и перевода строки IIRC) являются относительно редкими - вы можете обнаружить, что все в порядке, чтобы их разбить. Альтернативы должны придумать ваше собственное экранирование или закодировать всю строку как двоичный и base64 результат. Escaping займет гораздо меньше места, чем метод повторного кодирования:)