Pergunta

O que é a melhor maneira para serializar um HashTable (ou um dado melhor navegado através de um indexador corda) com SOAP / XML?

Vamos dizer que tenho um Foo que tem um Bar[] Bars propriedade. Um objeto Bar tem uma chave e um valor. Por padrão, este Serializa para o seguinte XML:

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

Para JSON, este Serializa para:

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

O que eu realmente gostaria de ter é este serialize para refletir melhor a relação subjacente. Por exemplo,

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

Sei que existem alguns desafios com a serialização para o SOAP, desta forma, mas qual é a melhor abordagem para fornecer um esquema que melhor reflete isso?

Eu tentei criar um objeto BarsCollection e definindo serialização personalizada sobre isso, mas não parece realmente invocar a serialização nesse objeto. Por exemplo.

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

Todas as sugestões? Qual é a melhor prática aqui?

Foi útil?

Solução

Eu realmente não acho que o que você quer reflete a estrutura melhor. Para definir um esquema (pense XSD) para isso você teria que saber todas as chaves possíveis com antecedência desde que você indicar que deseja que cada um ser um tipo personalizado separado. Conceptualmente barras seria um conjunto de objectos que prendem objectos do tipo Key0, Key1, com cada uma das classe KEYN contendo uma propriedade de valor. Eu acredito que a primeira serialização realmente é o melhor reflexo da estrutura subjacente. A razão por que "trabalha" mais como você quer em JSON é que você perde a digitação - tudo é apenas um objeto. Se você não se preocupam com os tipos porque não basta usar JSON?

Outras dicas

ISerializable não é usado para serialização de xml; seu usado para serialização binária. Você seria melhor implementar IXmlSerializable.

Mas eu acho que o KeyedCollection serializa mais como você está pensando. Só que você nunca vai conseguir desde que os elementos do mapa de classes.

Você poderia passar o hashtable em uma extensão SOAP. Dessa forma, você pode serializar-lo do jeito que você gostaria. Embora não haja código personalizado para isso que tem que ser no cliente e servidor.

Eu acho que está faltando uma chave fundamental do protocolo SOAP.

Uma das coisas que eu realmente gosto sobre o protocolo SOAP é que você pode definir objetos arbitrários (juntamente com métodos) em seu arquivo WSDL e passar esses objetos em torno de um lado para o outro utilizando o protocolo SOAP. Você não tem para serializar os dados em uma extremidade e, em seguida, unserialize-lo na outra extremidade.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top