Esta es una pregunta muy complicada sobre cómo serializar datos a través de una llamada de servicio web, cuando los datos no están fuertemente tipados. Trataré de exponerlo lo mejor posible.Serialización de pares de nombre/valor en un objeto personalizado a través del servicio web
almacenamiento de objetos de la muestra:
[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; }
}
la muestra Uso:
[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;
}
Valor de retorno del servicio 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>
lo que quiero:
<OtherInfo>
<Hobbies>Programming</Hobbies>
<Website>Stackoverflow.com</Website>
</OtherInfo>
La Razón & Otras Cosas:
En primer lugar, lo siento por la longitud del poste, pero quería dar reproducible código también.
Lo quiero en este formato, porque estoy consumiendo los servicios web de PHP. Quiero ir fácilmente:
// Este es imporante
In PHP => "$Result["StorageObject"]["OtherInfo"]["Hobbies"]".
Si está en otro formato, entonces no habría manera para mí para lograr eso, en absoluto. Además, en C# si estoy consumo del servicio, también me gustaría ser capaz de hacer lo siguiente:
// Este es imporante
In C# => var m = ServiceResult[0].OtherInfo["Hobbies"];
Por desgracia, no estoy seguro de cómo lograr esto . Pude obtenerlo de esta manera, construyendo un diccionario personalizado que implementó IXmlSerializer (vea StackOverflow: IXmlSerializer Dictionary), sin embargo, expulsó el esquema WSDL del agua. ¡También es demasiado complicado y produjo resultados horribles en mi aplicación WinFormsTester!
¿Hay alguna manera de lograr esto? ¿Qué tipo de objetos necesito crear? ¿Hay alguna forma de hacer esto/que no sea haciendo una colección fuertemente tipada /? Obviamente, si lo hago fuertemente tipado como esto:
public class OtherInfo {
public string Hobbies { get; set; }
public string FavoriteWebsite { get; set; }
}
Luego de que funcionaría perfectamente, lo habría hecho sin problemas WSDL, que sería capaz de acceder fácilmente a partir de PHP y C# (.OtherInfo.Hobbies) .
Sin embargo, perdería por completo el punto de NVP, en el sentido de que tendría que saber de antemano cuál es la lista, y sería inmutable ... por ejemplo, desde una base de datos.
¡Gracias a todos! Espero que podamos encontrar algún tipo de solución para esto.Aquí está son los requisitos más:
- esquema WSDL no debe romper
- pares de valores de nombre (de NVP) debe ser serializado a formato atributo
- debe ser fácil de acceder a la NVP de en PHP por su nombre [ "aficiones"]
- debe ser fácil de acceso en C# (y ser compatible con su generador de proxy)
- ser fácilmente serializable
- No me requieren para escribir los datos fuertemente
Ahora, estoy/completamente/abierto a la entrada de una manera mejor/diferente de hacer esto. Estoy almacenando información relativamente "estática" (como Nombre) y un montón de datos. Si hay una mejor manera, me encantaría escucharlo.
¡Gracias! Ambas son buenas ideas, Creo que puedo trabajar con cualquiera de esas soluciones para lograr mis objetivos. Buen trabajo en el XElement, no hubiera pensado en eso (falta de k ahora sobre eso. :PAG). –
Sería más interesante una vez que comience a tratar con JSON para javascript. –