Question

Quel est le meilleur moyen de sérialiser une table de hachage (ou une meilleure navigation dans un indexeur de chaînes) avec SOAP / XML?

Disons que j'ai un Foo qui a une propriété Bar[] Bars. Un objet Bar a une clé et une valeur. Par défaut, cela se sérialise au XML suivant:

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

Pour JSON, cela sérial à:

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

Ce que j'aimerais vraiment, c’est que cette sérialisation reflète mieux la relation sous-jacente. Par exemple,

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

Je réalise que la sérialisation vers SOAP pose certains problèmes de cette manière, mais quelle est la meilleure approche pour fournir un schéma qui reflète mieux cela?

J'ai essayé de créer un objet BarsCollection et de définir une sérialisation personnalisée sur cet objet, mais cela ne semble pas réellement appeler la sérialisation sur cet objet. Ex.

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

Des suggestions? Quelle est la meilleure pratique ici?

Était-ce utile?

La solution

Je ne pense vraiment pas que ce que vous voulez reflète mieux la structure. Pour définir un schéma (pensez XSD) à cette fin, vous devez connaître au préalable toutes les clés potentielles, car vous indiquez que vous souhaitez que chacune d’elles soit un type personnalisé distinct. Conceptuellement, les barres seraient un tableau d'objets contenant des objets de type Key0, Key1, chaque classe de KeyN contenant une propriété value. Je pense que la première sérialisation est en réalité le meilleur reflet de la structure sous-jacente. La raison pour laquelle il & «Fonctionne» & «; JSON vous donne l'impression que vous perdez la saisie - tout n'est qu'un objet. Si vous ne vous souciez pas des types, pourquoi ne pas utiliser simplement JSON?

Autres conseils

ISerializable n'est pas utilisé pour la sérialisation xml; son utilisé pour la sérialisation binaire. Vous feriez mieux de mettre en œuvre IXmlSerializable.

Mais je pense que KeyedCollection sérialise davantage comme vous le pensez. Sauf que vous n'aurez jamais & Lt; key0 ... / & Gt; < key1 ... / > puisque les éléments correspondent aux classes.

Vous pouvez passer la table de hachage dans une extension SOAP. De cette façon, vous pouvez le sérialiser à votre guise. Bien qu'il existe un code personnalisé pour cela qui doit être sur le client et le serveur.

Je pense qu'il vous manque une clé fondamentale du protocole SOAP.

Une des choses qui me plaisent dans le protocole SOAP est que vous pouvez définir des objets arbitraires (ainsi que des méthodes) dans votre fichier WSDL et les faire passer d’un bout à l’autre à l’aide du protocole SOAP. Il n'est pas nécessaire de sérialiser les données à une extrémité, puis de les désérialiser à l'autre extrémité.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top