Pregunta

¿Cuál es la mejor manera de serializar una HashTable (o datos que se navegan mejor a través de un indexador de cadenas) con SOAP/XML?

Digamos que tengo un Foo que tiene una propiedad Bar[] Bars.A Bar El objeto tiene una clave y un valor.De forma predeterminada, esto se serializa en el siguiente XML:

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

Para JSON, esto se serializa en:

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

Lo que realmente me gustaría tener es esta serialización para reflejar mejor la relación subyacente.P.ej.,

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

Me doy cuenta de que existen algunos desafíos al serializar en SOAP de esta manera, pero ¿cuál es el mejor enfoque para proporcionar un esquema que refleje mejor esto?

Intenté crear un objeto BarsCollection y definir una serialización personalizada en él, pero en realidad no parece invocar la serialización en ese objeto.P.ej.

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

¿Alguna sugerencia?¿Cuál es la mejor práctica aquí?

¿Fue útil?

Solución

Realmente no creo que lo que quieres refleje mejor la estructura.Para definir un esquema (piense en XSD) para esto, tendría que conocer todas las claves potenciales de antemano, ya que indica que desea que cada una sea un tipo personalizado independiente.Conceptualmente, las barras serían una matriz de objetos que contienen objetos de tipo Key0, Key1, y cada una de las clases KeyN contendrá una propiedad de valor.Creo que la primera serialización es en realidad el mejor reflejo de la estructura subyacente.La razón por la que "funciona" más como lo desea en JSON es que se pierde la escritura: todo es solo un objeto.Si no le importan los tipos, ¿por qué no utilizar JSON?

Otros consejos

ISerializable no se utiliza para la serialización xml;se utiliza para la serialización binaria.Sería mejor que implementaras IXmlSerializable.

Pero creo que KeyedCollection se serializa más como estás pensando.Excepto que nunca obtendrás <key0.../> <clave1.../> ya que los elementos se asignan a clases.

Podrías pasar la tabla hash en una extensión SOAP.De esa manera, puedes serializarlo como quieras.Aunque existe un código personalizado para esto que debe estar en el cliente y en el servidor.

Creo que te falta una clave fundamental del protocolo SOAP.

Una de las cosas que realmente me gusta del protocolo SOAP es que puedes definir objetos arbitrarios (junto con métodos) en tu archivo WSDL y pasar estos objetos de un extremo al otro usando el protocolo SOAP.No es necesario serializar los datos en un extremo y luego deserializarlos en el otro extremo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top