Каков наилучший способ сериализации HashTable для SOAP / XML? - PullRequest
1 голос
/ 18 сентября 2008

Каков наилучший способ сериализации HashTable (или данных, которые лучше всего перемещаются через индексатор строк) с помощью SOAP / XML?

Допустим, у меня есть Foo со свойством Bar[] Bars. Bar объект имеет ключ и значение. По умолчанию это сериализуется в следующий XML:

<Foo>
  <Bars>
    <Bar key="key0" value="value0"/>
    ...
  </Bars>
</Foo>

Для JSON это сериализуется в:

{"Foo":["Bars":[{"Key":"key0","Value":"key1} ... ]}]}

Что я действительно хотел бы получить, так это сериализовать, чтобы лучше отразить основные отношения. Например,

<Foo>  
  <Bars>  
    <Key0 value="value0"/>
    <Key1 value="value1"/>
    ...
  </Bars>
</Foo>

Я понимаю, что при сериализации в SOAP существуют некоторые проблемы, но каков наилучший подход к предоставлению схемы, которая лучше отражает это?

Я пытался создать объект BarsCollection и определить для него пользовательскую сериализацию, но, похоже, он на самом деле не вызывает сериализацию для этого объекта. Э.Г.

void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context) {  
  foreach (Bar bar in Bars){           
    info.AddValue(bar.Key. bar);
  }
}  

Есть предложения? Какова лучшая практика здесь?

Ответы [ 4 ]

1 голос
/ 18 сентября 2008

Я действительно не думаю, что то, что вы хотите, лучше отражает структуру. Чтобы определить для этого схему (например, XSD), вам необходимо знать все потенциальные ключи заранее, поскольку вы указываете, что хотите, чтобы каждый из них представлял собой отдельный пользовательский тип. Концептуально Bars - это массив объектов, содержащих объекты типа Key0, Key1, причем каждый из классов KeyN содержит свойство value. Я считаю, что первая сериализация на самом деле является лучшим отражением базовой структуры. Причина, по которой это «работает» больше, чем вы хотите в JSON, заключается в том, что вы теряете набор текста - все является просто объектом. Если вам не нужны типы, почему бы просто не использовать JSON?

0 голосов
/ 18 сентября 2008

Я думаю, что вам не хватает фундаментального ключа протокола SOAP.

Одна из вещей, которые мне действительно нравятся в протоколе SOAP, это то, что вы можете определять произвольные объекты (вместе с методами) в своем файле WSDL и передавать эти объекты с одного конца на другой, используя протокол SOAP. Вам не нужно сериализовать данные на одном конце, а затем десериализовать их на другом конце.

0 голосов
/ 18 сентября 2008

Вы можете передать хеш-таблицу в расширении SOAP. Таким образом, вы можете сериализовать его так, как захотите. Хотя для этого есть специальный код, который должен быть на клиенте и сервере.

0 голосов
/ 18 сентября 2008

ISerializable не используется для сериализации xml; используется для двоичной сериализации. Вы бы лучше реализовали IXmlSerializable.

Но я думаю, что KeyedCollection сериализуется больше, чем вы думаете. За исключением того, что вы никогда не получите , поскольку элементы отображаются на классы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...