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:
- WSDL schéma ne doit pas casser
- Paires nom /valeur (NVP) doit être sérialisé en attribut format
- Devrait être facile d'accéder à la NVP est en PHP par nom ["passe-temps"]
- Doit être facile d'accès en C# (et être compatible avec générateur de Proxy)
- Facilement être sérialisable
- 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
Vous devez vous connecter pour publier un commentaire.
C'est comme dynamique propriétés d'un objet.
C# n'est pas un langage dynamique contrairement à javascript ou peut-être que PHP peut analyser les propriétés de l'objet à la volée. Les deux méthodes suivantes sont ce que je pense. Le second pourrait s'adapter à vos besoins.
Le BAISER de Façon
Le Keep It Simple Stupid façon
Vous pouvez avoir des paires nom /valeur séparés par '|'
Sérialisé formes
D'une Manière Dynamique en C#
Faire la paire nom /valeur de la partie de devenir un élément XML de sorte que vous pouvez construire dynamiquement.
Vous pouvez facilement construire OtherInfo objet comme élément centrée sur
par exemple,
La forme sérialisée sera
ou de le construire comme attribut centrée sur
Pour n'importe quel langage de programmation dynamique, il peut accéder aux propriétés directement.
Pour le reste, ils peuvent accéder à la valeur par lire le fichier XML. Lire le XML est bien pris en charge par la plupart de cadre.
Il serait plus intéressant une fois que vous commencer à traiter avec JSON pour le javascript.
OriginalL'auteur Ray Lu
C'est ce que j'ai installés sur.
Structure De Classe:
Utilisation:
De sortie:
Je tiens à remercier tout le monde pour leur aide, j'apprécie vraiment l'aide et des idées.
OriginalL'auteur Matthew M.
Comme un complètement différent sur ce, pourquoi ne pas envisager de le faire d'une manière complètement différente. Ont une méthode de service web pour retourner le sérialisé objet de stockage, moins le
OtherInfo
et une autre méthode pour renvoyer la liste des propriétés (clé) pourOtherInfo
, et un troisième retour à la liste des valeurs de n'importe quelle touche. Accordé, il faudra plus d'allers-retours vers le service web si vous voulez toutes les données, mais la solution sera beaucoup plus simple et plus souple.OriginalL'auteur tvanfosson
Ont un coup d'oeil dans le Système.Xml.La sérialisation.XmlSerializerAssemblyAttribute attribut. Ceci vous permet de spécifier une classe personnalisée au niveau de sérialiseur. Vous serez capable de cracher ce que XML vous le souhaitez.
Un moyen rapide d'obtenir jusqu'à la vitesse sur ces est d'utiliser sgen.exe pour générer un et avoir un coup d'oeil à elle avec Réflecteur.
-Oisin
OriginalL'auteur x0n
Je ne suis pas sûr que cela permettrait de résoudre votre problème (en C#, mais peut-être pas en PHP), mais essayez d'utiliser
Dictionary<string,List<string>> OtherInfo
au lieu deList<NameValuePairs>
. Ensuite, "Loisirs" et "Sites web" serait vos clés et les valeurs de la liste de passe-temps ou des sites web. Je ne suis pas sûr de savoir comment il serait sérialiser.Vous seriez en mesure de référencer les listes de loisirs comme:
[MODIFIER] Voir ici pour un générique de la sérialisation XML dictionnaire. Cette classe dérivée est celui que vous devez utiliser à la place de Dictionnaire générique.
Dictionnaire<TKey,TValue> est sérialisable si vous en tirer et marque de la classe dérivée comme sérialisable. cs.rthand.com/blogs/blog_with_righthand/archive/2005/08/06/...
Cependant, vous sérialiser dictionnaire dans WCF, le datacontractSerializer
Référence code pourrait être personnalisé pour représenter l'élément dans n'importe quel format que vous voulez de sorte que vous pouvez contrôler la façon dont il semble à PHP. Je ne suis pas familier avec WCF, mais je vais prendre une classe dans une couple de semaines.
OriginalL'auteur