уменьшить разметку XML для словаря wcf - PullRequest
2 голосов
/ 19 апреля 2011

Я разрабатываю метод WCF, который возвращает данные объекта, включая свойство Dictionary.XML содержит большое количество разметки, и мне было интересно, есть ли способы уменьшить разметку.

Ниже приведен пример текущего вывода XML для словаря:

<gases>
 <a:KeyValueOfstringfloat>
  <a:Key>CH4</a:Key> 
  <a:Value>40</a:Value> 
 </a:KeyValueOfstringfloat>
 <a:KeyValueOfstringfloat>
  <a:Key>CO2</a:Key> 
  <a:Value>60</a:Value> 
 </a:KeyValueOfstringfloat>
</gases>

Длякаждый дополнительный элемент газа добавляется в коллекцию, добавляется дополнительный <a:KeyValueOfstringfloat> вместе с его содержимым.Можно ли настроить форматирование на что-то вроде:

<gases>
 <key>value</key>
</gases>

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 19 апреля 2011

Может быть, не совсем то, что вы ищете, но GZip-сообщения по проводам очень помогут

0 голосов
/ 19 апреля 2011

Существует несколько вариантов, но оба они не используют тип словаря .NET для вашей коллекции. Учитывая желаемый результат, посмотрите на принятый ответ на этот вопрос.

В противном случае, если вы хотите простой XML, вам нужно использовать простую структуру классов. Определите класс gas, который содержит свойство с именем key, представляющее собой массив строк. Я почти уверен, что полученный мыльный XML, вероятно, выглядит так, как вы отобразили.

В обоих случаях это может быть не то, что вы действительно хотите. Я предполагаю, что ключевой элемент в XML должен быть различным для каждой пары ключ / значение, но вы должны быть в состоянии спроектировать свои классы, чтобы справиться с этим (например, создать класс элемента со свойствами строки имени и значения). Если вы хотите работать с классом gas в качестве словаря, вам потребуется написать код для этого.

ОБНОВЛЕНИЕ: Вот пример того, как настраиваемый атрибут CollectionDataContract может быть:

[CollectionDataContract(
    Name = "Cities",
    ItemName = "city",
    KeyName = "cityName",
    ValueName = "population")]
public class CityList
    : IDictionary<string, int>,
      IEnumerable<System.Collections.Generic.KeyValuePair<string, int>>
{
/// snipped
}
...