Serialisieren von Name/Wert-Paare in einem Benutzerdefinierten Objekt via Web-Service

Dies ist eine sehr komplizierte Frage über das serialisieren von Daten über eine web-service-Aufruf, wenn die Daten nicht stark typisiert. Ich werde versuchen, legte es so gut wie möglich.

Sample Storage-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 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 Webservice:

<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>

Der Grund & Andere Sachen:

Erste, tut mir Leid für die Länge der post, aber ich wollte die reproduzierbare code.

Möchte ich es in diesem format, da bin ich dem Verzehr der web-services aus PHP. Ich will einfach gehen:

//DIES IST IMPORANT

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

Wenn er in einem anderen format, dann würde es keine Möglichkeit für mich, um zu erreichen, dass an allen. Darüber hinaus werden in C#, wenn ich das konsumieren des Dienstes, ich möchte auch in der Lage sein, Folgendes zu tun:

//DIES IST IMPORANT

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

Leider bin ich mir nicht sicher, wie dies zu erreichen. Ich war in der Lage, es auf diese Weise, durch die Erstellung eines benutzerdefinierten Wörterbuchs, die umgesetzt IXmlSerializer (siehe StackOverflow: IXmlSerializer Wörterbuch), jedoch blies er die WSDL-schema aus dem Wasser. Es ist auch viel zu kompliziert, und produziert schreckliche Ergebnisse in meinem WinFormsTester Anwendung!

Gibt es eine Möglichkeit, dies zu erreichen ? Welche Art von Objekten muss ich erstellen ? Gibt es eine Möglichkeit, dies zu tun /andere als durch eine stark typisierte Auflistung/? Natürlich, wenn ich es stark typisierte so:

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

Dann ist es perfekt funktionieren würde, hätte ich keine WSDL-Probleme, ich wäre in der Lage, leicht zugänglich von PHP und C# (.OtherInfo.Hobbys).

Ich würde allerdings komplett verlieren, der Punkt der NVP ist, dass hätte ich im Voraus wissen, was die Liste ist, und es wäre unveränderlich.. sagen wir, aus einer Datenbank.

Vielen Dank an alle!! Ich hoffe, wir sind in der Lage zu kommen mit irgendeiner Art von Lösung. Hier sind die Anforderungen wieder:

  1. WSDL-schema sollte nicht brechen
  2. Name-Wert-Paare (NVP ist), die serialisiert werden sollen, die in Attribut-format
  3. Sollte einfach zugänglich sein, NVP-Wert ist in PHP, name ["Hobbys"]
  4. Sollten leicht zugänglich in C# (und die Kompatibilität mit Proxy-generator)
  5. Leicht serialisierbar
  6. Nicht von mir verlangen, zu stark, geben Sie die Daten

Nun, ich bin /komplett/open input auf eine bessere/andere Möglichkeit, dies zu tun. Ich bin die Speicherung einige relativ "statische" Informationen (wie Namen), und ein paar Stücke von Daten. Wenn es einen besseren Weg, ich würde es gerne hören.

InformationsquelleAutor Matthew M. | 2008-11-01
Schreibe einen Kommentar