La sérialisation de Paires Nom/Valeur dans un Objet Personnalisé via un Service Web

C'est très compliqué question concernant comment sérialiser des données par l'intermédiaire d'un appel de service web, lorsque les données ne sont pas fortement typé. Je vais essayer de jeter le mieux possible.

De Stockage Des Échantillons De L'Objet:

[Serializable]
public class StorageObject {
  public string Name { get; set; }
  public string Birthday { get; set; }
  public List<NameValuePairs> OtherInfo { get; set; }  
}
[Serializable]   
public class NameValuePairs {
  public string Name { get; set; }
  public string Value { get; set; }
}

Exemple D'Utilisation:

[WebMethod]
    public List<StorageObject> GetStorageObjects() {
      List<StorageObject> o = new List<StorageObject>() {
        new StorageObject() { 
          Name = "Matthew",
          Birthday = "Jan 1st, 2008", 
          OtherInfo = new List<NameValuePairs>() {
            new NameValuePairs() { Name = "Hobbies", Value = "Programming" },
            new NameValuePairs() { Name = "Website", Value = "Stackoverflow.com" }
          }
        },
        new StorageObject() { 
          Name = "Joe",
          Birthday = "Jan 10th, 2008",
          OtherInfo = new List<NameValuePairs>() { 
            new NameValuePairs() { Name = "Hobbies", Value = "Programming" },
            new NameValuePairs() { Name = "Website", Value = "Stackoverflow.com" }
          }
        }
      };

      return o;
    }

Valeur de retour de Service Web:

<StorageObject>
    <Name>Matthew</Name>
    <Birthday>Jan 1st, 2008</Birthday>
    <OtherInfo>
        <NameValuePairs>
            <Name>Hobbies</Name>
            <Value>Programming</Value>
        </NameValuePairs>
        <NameValuePairs>
            <Name>Website</Name>
            <Value>Stackoverflow.com</Value>
        </NameValuePairs>
    </OtherInfo>
</StorageObject>

Ce que je veux:

<OtherInfo>
    <Hobbies>Programming</Hobbies>
    <Website>Stackoverflow.com</Website>
</OtherInfo>

La Raison & Autres Trucs:

D'abord, je suis désolé pour la longueur du post, mais je voulais donner reproductible de code.

Je le veux dans ce format, parce que je suis de consommer des services web à partir de PHP. Je veux facilement aller:

//C'EST IMPORANT

In PHP => "$Result["StorageObject"]["OtherInfo"]["Hobbies"]".  

Si c'est dans l'autre format, alors il n'y aurait aucun moyen pour moi de réaliser que, à tous. En outre, en C# si je suis la consommation du service, je tiens également à être en mesure de faire ce qui suit:

//C'EST IMPORANT

In C# => var m = ServiceResult[0].OtherInfo["Hobbies"];

Malheureusement, je ne suis pas sûr de la façon de les accomplir. J'ai été capable de le faire de cette façon, par la construction d'un Dictionnaire personnel mis en œuvre IXmlSerializer (voir StackOverflow: IXmlSerializer Dictionnaire), cependant, il a soufflé le schéma WSDL hors de l'eau. Il est aussi beaucoup trop compliqué, et produit des résultats horribles dans mon WinFormsTester application!

Est-il un moyen pour accomplir cette ? Ce type d'objets, dois-je créer ? Est-il possible de faire ceci, autres que la fabrication d'un fortement typé collection/? Évidemment, si je le fais, fortement typé comme ceci:

public class OtherInfo {
  public string Hobbies { get; set; }
  public string FavoriteWebsite { get; set; }
}

Alors qu'il fonctionne parfaitement, je n'aurais pas WSDL questions, je serais capable d'y accéder facilement à partir de PHP et C# (.OtherInfo.Hobbies).

Cependant, je tiens à le perdre complètement le point de la NVP, que je dois savoir à l'avance ce que la liste est, et il serait immuable.. dire, à partir d'une Base de données.

Merci à tous!! J'espère que nous sommes en mesure de venir avec une sorte de solution à cette question. Ici sont les exigences de nouveau:

  1. WSDL schéma ne doit pas casser
  2. Paires nom /valeur (NVP) doit être sérialisé en attribut format
  3. Devrait être facile d'accéder à la NVP est en PHP par nom ["passe-temps"]
  4. Doit être facile d'accès en C# (et être compatible avec générateur de Proxy)
  5. Facilement être sérialisable
  6. Pas m'obliger à fortement du type de données

Maintenant, je suis /complètement/ouverts aux commentaires sur une meilleure/les différentes façon de le faire. Je suis le stockage d'une partie relativement "statique" de l'information (comme Nom), et un tas de morceaux de données. Si il ya une meilleure façon, je serais ravi de l'entendre.

OriginalL'auteur Matthew M. | 2008-11-01