Мы собираем множество строк и отправляем их нашим клиентам в виде xml-фрагментов. Эти строки могут содержать буквально любой символ. Мы наблюдали ошибку, вызванную попыткой сериализовать экземпляры XElement, содержащие «плохие» символы. Вот пример:
var message = new XElement("song");
char c = (char)0x1a; //sub
var someData = string.Format("some{0}stuff", c);
var attr = new XAttribute("someAttr", someData);
message.Add(attr);
string msgStr = message.ToString(SaveOptions.DisableFormatting); //exception here
Приведенный выше код генерирует исключение в указанной строке. Вот трассировка стека:
'SUB', hexadecimal value 0x1A, is an invalid character. System.ArgumentException System.ArgumentException: '', hexadecimal value 0x1A, is an invalid character. at System.Xml.XmlEncodedRawTextWriter.InvalidXmlChar(Int32 ch, Char* pDst, Boolean entitize) at System.Xml.XmlEncodedRawTextWriter.WriteAttributeTextBlock(Char* pSrc, Char* pSrcEnd) at System.Xml.XmlEncodedRawTextWriter.WriteString(String text) at System.Xml.XmlWellFormedWriter.WriteString(String text) at System.Xml.XmlWriter.WriteAttributeString(String prefix, String localName, String ns, String value) at System.Xml.Linq.ElementWriter.WriteStartElement(XElement e) at System.Xml.Linq.ElementWriter.WriteElement(XElement e) at System.Xml.Linq.XElement.WriteTo(XmlWriter writer) at System.Xml.Linq.XNode.GetXmlString(SaveOptions o)
Я подозреваю, что это неправильное поведение, и плохой символ следует экранировать в XML. Желательно это или нет — вопрос, на который я отвечу позже.
Итак, вот вопрос:
Есть ли какой-то способ обработки строк, чтобы эта ошибка не возникала, или я должен просто удалить все символы ниже char 0x20
и скрестить пальцы?