Das ist eine sehr komplizierte Frage, die angibt, wie Daten über einen Webdienstaufruf serialisiert werden, wenn die Daten nicht stark typisiert werden. Ich werde versuchen, es so gut wie möglich auszulegen.Serialisierung von Name/Wert-Paaren in einem benutzerdefinierten Objekt über Webdienst
Probenlagerung Objekt:
[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; }
}
Beispiel zu verwenden:
[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;
}
Rückgabewert von Web Service:
<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>
Was ich will:
<OtherInfo>
<Hobbies>Programming</Hobbies>
<Website>Stackoverflow.com</Website>
</OtherInfo>
The Reason & Other Stuff:
Zuerst tut mir leid für die Länge der Post, aber ich wollte auch reproduzierbar Code geben.
Ich möchte es in diesem Format, weil ich die Webdienste von PHP konsumiere. Ich mag einfach gehen:
// Das ist imporant
In PHP => "$Result["StorageObject"]["OtherInfo"]["Hobbies"]".
Wenn es in dem anderen Format ist, dann gäbe es keine Möglichkeit für mich, das zu erreichen, überhaupt nicht. IS
// DIESE imporant
In C# => var m = ServiceResult[0].OtherInfo["Hobbies"];
Leider bin ich nicht sicher, wie dies zu tun: in C# Außerdem, wenn ich den Dienst am raubend, würde ich auch folgendes tun möchte in der Lage sein, . Ich konnte es auf diese Weise erreichen, indem ich ein benutzerdefiniertes Dictionary erstellte, das IXmlSerializer (siehe StackOverflow: IXmlSerializer Dictionary) implementierte, jedoch das WSDL-Schema aus dem Wasser löste. Es ist auch viel zu kompliziert und hat schreckliche Ergebnisse in meiner WinFormsTester Anwendung erzeugt!
Gibt es eine Möglichkeit, dies zu erreichen? Welche Art von Objekten muss ich erstellen? Gibt es eine Möglichkeit, dies zu tun/anders als durch eine stark typisierte Sammlung /? Natürlich, wenn ich es stark typisierte wie diese machen:
public class OtherInfo {
public string Hobbies { get; set; }
public string FavoriteWebsite { get; set; }
}
Dann wäre es perfekt funktionieren, würde ich keine WSDL Probleme haben, ich wäre in der Lage sein, einen einfachen Zugriff auf sie von PHP und C# (.OtherInfo.Hobbies) .
Allerdings würde ich den Punkt der NVP völlig verlieren, in dem ich im Voraus wissen müsste, was die Liste ist, und es wäre unveränderbar .. sagen wir, aus einer Datenbank.
Danke an alle !! Ich hoffe, wir können hier eine Lösung finden.Hier sind die Anforderungen wieder:
- WSDL-Schema nicht
- Name des Wert-Paare brechen sollte (NVP ist) sollte in Attribut-Format serialisiert werden
- Sollte einfach namentlich NVP ist in PHP für den Zugriff auf [ "Hobby"]
- Sollte für den Zugriff in C# leicht sein (und kompatibel sein mit ihm Generator Proxy ist)
- leicht sein serializable
- mich benötigen dringend die Daten eingeben
Jetzt bin ich/vollständig/offen auf eine bessere/andere Weise zu tun, dies zu tun. Ich speichere einige relativ "statische" Informationen (wie Name) und eine Menge Daten. Wenn es einen besseren Weg gibt, würde ich es gerne hören.
Danke !! Beide sind großartige Ideen, ich Ich denke, dass ich mit einer dieser Lösungen arbeiten kann, um meine Ziele zu erreichen. "Gute Arbeit am XElement, darüber hätte ich nicht nachgedacht (Mangel an k darüber nachzudenken. : P). –
Es wäre interessanter, wenn Sie anfangen, JSON für Javascript zu behandeln. –