В основном у меня есть DataContract
, который содержит Dictionary
:
[DataContract]
public class MyDictionary : IDictionary<string, object> {
[DataMember(Name = "Data")]
protected IDictionary<string, object> Dictionary { get; private set; }
// ...
}
Вот соответствующая часть вывода XML:
<Data>
<a:KeyValueOfstringanyType>
<a:Key>ID</a:Key>
<a:Value i:type="s:int">2</a:Value>
</a:KeyValueOfstringanyType>
<a:KeyValueOfstringanyType>
<a:Key>Value</a:Key>
<a:Value i:type="s:int">4711</a:Value>
</a:KeyValueOfstringanyType>
</Data>
Как я могу упростить вывод примерно так:
<Data>
<ID i:type="s:int">2</ID>
<Value i:type="s:int">4711</Value>
</Data>
Ключ словаря ограничен строкой, поэтому, если никому не придет в голову глупая идея использовать не ascii-ключи, это должно работать нормально. Я нашел атрибут CollectionDataContract
, с которым я немного приближаюсь к тому, что хочу, но пары ключ-значение будут сохранены, что тратит память. Возможно, с классом ISerializable
можно работать, но я не уверен, что это создаст проблемы с DataContractSerializer
. Кстати, решение должно работать и с DataContractJsonSerializer
.
Entry
вокруг идентификатора/значения, чтобы вы могли иметь несколько пар KeyValuePair.<Data><Entry><ID i:type="s:int">2</ID><Value i:type="s:int">4711</Value></Entry></Data>
РЕДАКТИРОВАТЬ: Извините, я не заметил, что ваше последнее предложение хочет, чтобы оно работало как с сериализаторами JSON, так и с XML. - person Chris Sinclair   schedule 28.06.2012Entry
s? - person rekire   schedule 28.06.2012<Data><ID /><ID /><ID /><Value /><Value /><Value /></Data>
и предположить, что они находятся в том же порядке, чтобы правильно связать записи ID с записями Value. - person Chris Sinclair   schedule 28.06.2012