Как лучше всего сериализовать HashTable для SOAP/XML?

StackOverflow https://stackoverflow.com/questions/88682

  •  01-07-2019
  •  | 
  •  

Вопрос

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

Допустим, у меня есть Foo у которого есть свойство Bar[] BarsBar объект имеет ключ и значение.По умолчанию это сериализуется в следующий 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);
  }
}  

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

Это было полезно?

Решение

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

Другие советы

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

Но я думаю, что KeyedCollection сериализуется так, как вы думаете.Вот только вы никогда не получите <key0.../> <ключ1 .../> поскольку элементы сопоставляются с классами.

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top