Pregunta

En lugar de devolver una cadena común, ¿hay alguna forma de devolver objetos clásicos?Si no:¿Cuáles son las mejores prácticas?¿Transpone su objeto a xml y reconstruye el objeto en el otro lado?¿Cuáles son las otras posibilidades?

¿Fue útil?

Solución

Como se mencionó, puede hacer esto en .net mediante serialización.De forma predeterminada, todos los tipos nativos son serializables, por lo que esto sucede automáticamente.

Sin embargo, si tiene tipos complejos, deberá marcar el objeto con el atributo [Serializable].Lo mismo ocurre con los tipos complejos como propiedades.

Entonces, por ejemplo, necesitas tener:

[Serializable]
public class MyClass
{
    public string MyString {get; set;}

    [Serializable]
    public MyOtherClass MyOtherClassProperty {get; set;}
}

Otros consejos

Si el objeto se puede serializar en XML y se puede describir en WSDL, entonces sí, es posible devolver objetos desde un servicio web.

Sí:en .NET llaman a esto serialización, donde los objetos se serializan en XML y luego el servicio consumidor los reconstruye en su tipo de objeto original o un sustituto con la misma estructura de datos.

Cuando es posible, transpongo los objetos a XML; esto significa que el servicio web es más portátil; luego puedo acceder al servicio en cualquier idioma, solo necesito crear el analizador/transpositor de objetos en ese idioma.

Debido a que tenemos archivos WSDL que describen el servicio, esto está casi automatizado en algunos sistemas.

(Por ejemplo, tenemos un servidor escrito en Python puro que reemplaza un servidor escrito en C, un cliente escrito en C++/gSOAP y un cliente escrito en Cocoa/Objective-C.Usamos SOAPUI como marco de prueba, que está escrito en Java).

Es posible devolver objetos de un servicio web utilizando XML.Pero se supone que los servicios web son independientes de la plataforma y del sistema operativo.Serializar un objeto simplemente le permite almacenar y recuperar un objeto de un flujo de bytes, como un archivo.Por ejemplo, puede serializar un objeto Java, convertir ese flujo binario (quizás mediante una codificación Base 64 en un campo CDATA) y transferirlo al cliente del servicio.

Pero el cliente sólo podría restaurar ese objeto si estuviera basado en Java.Además, se requiere una copia profunda para serializar un objeto y restaurarlo exactamente.Las copias profundas pueden resultar caras.

Su mejor ruta es crear un esquema XML que represente el documento y crear una instancia de ese esquema con los detalles del objeto.

.NET hace esto automáticamente con objetos que son serializables.Estoy bastante seguro de que Java funciona de la misma manera.

Aquí hay un artículo que habla sobre la serialización de objetos en .NET:http://www.codeguru.com/Csharp/Csharp/cs_syntax/serialization/article.php/c7201

@Brian:No sé cómo funcionan las cosas en Java, pero en .net los objetos se serializan en XML, no en cadenas base64.El servicio web publica un archivo wsdl que contiene las definiciones de métodos y objetos necesarios para su servicio web.

Espero que nadie cree servicios web que simplemente creen una cadena base64.

Daniel Auger:
Como han dicho otros, es posible.Sin embargo, si tanto el servicio como el cliente usan un objeto que tiene exactamente el mismo comportamiento de dominio en ambos lados, probablemente no necesitara un servicio en primer lugar.

lomax:Tengo que estar en desacuerdo con esto, ya que es un comentario algo estrecho.El uso de un servicio web que puede serializar los objetos de dominio a XML significa que facilita que los clientes funcionen con los mismos objetos de dominio, pero también significa que esos clientes están restringidos a usar ese servicio web en particular que ha expuesto y también funciona Revierta permitiendo que otros clientes no tengan conocimiento de sus objetos de dominio, pero aún interactúan con su servicio a través de XML.

@Lomax:Has descrito dos escenarios. Escenario 1: El cliente está rehidratando el mensaje xml nuevamente en exactamente el mismo objeto de dominio.Considero que esto es "devolver un objeto".En mi experiencia, esta es una mala elección y lo explicaré a continuación. Escenario 2: El cliente rehidrata el mensaje xml en algo que no sea exactamente el mismo objeto de dominio:Estoy 100% detrás de esto, sin embargo, no considero que esto devuelva un objeto de dominio.Realmente está enviando un mensaje o DTO.

Ahora permítanme explicar por qué la serialización de objetos DTO verdadera/pura/no en un servicio web es generalmente una mala idea.Una afirmación:Para hacer esto en primer lugar, debe ser el propietario tanto del cliente como del servicio, o proporcionarle al cliente una biblioteca para que pueda rehidratar el objeto nuevamente en su tipo verdadero.El problema:Este objeto de dominio como tipo ahora existe y pertenece a dos dominios semirelacionados.Con el tiempo, es posible que sea necesario agregar comportamientos en un dominio que no tienen sentido en el otro, lo que genera contaminación y problemas potencialmente dolorosos.

Por lo general, prefiero el escenario 2.Sólo utilizo el escenario 1 cuando hay una razón abrumadora para hacerlo.

Pido disculpas por ser tan conciso con mi respuesta inicial.Espero que esto aclare las cosas hasta cierto punto en cuanto a mi opinión.Lomax, parece que estamos medio de acuerdo ;).

JSON es una forma bastante estándar de pasar objetos por la web (como un subconjunto de javascript).Muchos idiomas cuentan con una biblioteca que convertirá el código JSON en un objeto nativo; consulte, por ejemplo simplejson en pitón.

Para obtener más bibliotecas para uso JSON, consulte la página web JSON

Como han dicho otros, es posible.Sin embargo, si tanto el servicio como el cliente utilizan un objeto que tiene exactamente el mismo comportamiento de dominio en ambos lados, probablemente no necesitaba un servicio en primer lugar.

Como han dicho otros, es posible.Sin embargo, si tanto el servicio como el cliente usan un objeto que tiene exactamente el mismo comportamiento de dominio en ambos lados, probablemente no necesitara un servicio en primer lugar.

No estoy de acuerdo con esto porque es un comentario algo limitado.Usar un servicio web que puede serializar objetos de dominio a XML significa que se lo pone fácil a los clientes que trabajan con los mismos objetos de dominio, pero también significa que esos clientes están restringidos a usar ese servicio web en particular que usted ha expuesto y que también funciona en revierta al permitir que otros clientes no tengan conocimiento de los objetos de su dominio pero aún así interactúen con su servicio a través de XML.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top