Подтвердить что ты не робот

Сериализация непечатаемого символа

Следующий код:

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

Я что-то делаю неправильно? Или есть разумная работа?

Большое спасибо!

4b9b3361

Ответ 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 займет гораздо меньше места, чем метод повторного кодирования:)