Сериализация непечатного характера - PullRequest
13 голосов
/ 16 мая 2011

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

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 ]

12 голосов
/ 16 мая 2011

Существует обходной путь, как объяснено здесь - вы можете использовать опцию XmlReaderSettings.CheckCharacters, чтобы игнорировать проверку символов:

XmlReader xr = XmlReader.Create(new StringReader(serialized),
    new XmlReaderSettings { CheckCharacters = false });
var dc = (string)serializer.Deserialize(xr);
7 голосов
/ 16 мая 2011

Вы пытаетесь сериализовать символы, которые не могут быть представлены в XML.К сожалению, они нарушают сериализацию XML.Я не знаю каких-либо обходных путей для этого, кроме написания собственного кода перехода.

С другой стороны, фактическое использование таких символов (символы ASCII перед пробелом, кроме табуляции, возврата каретки и перевода строки IIRC) относительно редки - вы можете обнаружить, что все в порядке, просто раздеть их.В качестве альтернативы можно придумать собственный выход или закодировать всю строку в двоичном виде, а в результате - base64.Экранирование займет намного меньше места, чем метод перекодировки:)

...