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

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

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