С#: массив байтов в xml CData

У меня есть служба WCF, которая возвращает блок xml. Одним из элементов является раздел CData[]. Мое приложение считывает файл HTML из базы данных и преобразует его в массив байтов [] PDF с помощью ABCPDF. Затем в моем XmlWriter я добавляю байты в раздел CData.

Проблема в том, что полученный xml выглядит так:

<![CDATA[System.Byte[]]]>

Как я могу получить строку байтов в разделе CData? Я пробовал такие вещи, как:

string str;
ASCIIEncoding enc = new ASCIIEncoding();
str = enc.GetString(theData);

а также

Convert.ToBase64String(theData);

Я застрял!! Любая помощь будет здорово, спасибо!


person Blaze    schedule 08.06.2009    source источник
comment
Что вы получаете на выходе, когда используете Convert.ToBase64String? Вероятно, это лучший способ сделать это (использование ASCIIEncoding.GetString работает только в том случае, если байты представляют допустимую строку ASCII).   -  person Jonathan Rupp    schedule 08.06.2009


Ответы (2)


Использование Convert.ToBase64String(data) — это определенно правильный путь, если вы контролируете обе стороны. Вы не хотите отправлять «сырые» байты и притворяться, что они являются действительными текстовыми данными. Используйте Convert.FromBase64String(text) на другой стороне.

Я немного удивлен, что WCF не обрабатывает это автоматически. Я не могу сказать, что использовал его сам (может появиться Марк Гравелл - я полагаю, у него большой опыт в этом), но я ожидаю, что он просто выставит байтовые массивы. Почему вы занимаетесь на уровне XML?

person Jon Skeet    schedule 08.06.2009
comment
В частности, многие управляющие символы не допускаются в XML-документах, включая nul (0). - person Richard; 08.06.2009
comment
Convert.ToBase64String() теперь работает, я все еще возвращал массив байтов в своем методе. Грррр!!! Спасибо... - person Blaze; 08.06.2009

Трудно точно сказать, где именно возникает ваша проблема — может помочь более полный пример кода. Но из того, что вы показываете как сериализованное, очень похоже, что ToString() вызывается на вашем byte[].

Вам следует изучить возможность использования Convert.ToBase64String(), если вы пытаетесь отправить двоичные данные по сети. Если вы не контролируете формат приема, вам нужно посмотреть, какая кодировка для этого требуется.

person LBushkin    schedule 08.06.2009