Pergunta

Em vez de retornar uma string comum, existe uma maneira de retornar objetos clássicos?Se não:quais são as melhores práticas?Você transpõe seu objeto para xml e reconstrói o objeto do outro lado?Quais são as outras possibilidades?

Foi útil?

Solução

Como mencionado, você pode fazer isso no .net via serialização. Por padrão todos os tipos nativos são serializáveis ??assim que este acontece automagicamente para você.

No entanto, se você tiver tipos complexos, você precisa para marcar o objeto com o atributo [Serializable]. O mesmo acontece com tipos complexos como propriedades.

Assim, por exemplo, você precisa ter:

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

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

Outras dicas

Se o objeto pode ser serialize para XML e pode ser descrita em WSDL, então sim, é possível retornar objetos de um serviço web.

Sim.: Em .NET eles chamam isso de serialização, onde os objetos são serializados em XML e depois reconstruída pela volta serviço consumindo em seu tipo de objeto original ou um substituto com a mesma estrutura de dados

Sempre que possível, eu transpor os objetos em XML - isso significa que o Serviço Web é mais portátil -. Posso, então, acessar o serviço em qualquer língua, eu só preciso para criar o analisador / object transposer nesse idioma

Porque nós temos arquivos WSDL descrevendo o serviço, isso é quase automático em alguns sistemas.

(Por exemplo, temos um servidor escrito em python puro, que está substituindo um servidor escrito em C, um cliente escrito em C ++ / gSOAP, e um cliente escrito em Cocoa / Objective-C. Usamos soapUI como um framework de testes , que é escrito em Java).

É possível retornar objetos de um serviço web usando XML. Mas Web Services é suposto ser plataforma e sistema operacional agnóstico. Serialização de um objeto simplesmente permite armazenar e recuperar um objeto a partir de um fluxo de bytes, como um arquivo. Por exemplo, você pode serializar um objeto Java, converter esse fluxo binário (talvez através de uma codificação Base 64 em um campo CDATA) e transferência que para o cliente do serviço.

Mas o cliente só seria capaz de restaurar esse objeto se fosse baseada em Java. Além disso, uma cópia profunda é necessária para serializar um objeto e tê-lo restaurado exatamente. cópias de profundidade pode ser caro.

Seu melhor caminho é criar um esquema XML que representa o documento e criar uma instância desse esquema com as especificidades de objetos.

.NET faz isso automaticamente com objetos que são serializáveis. Tenho certeza de Java funciona da mesma maneira.

Aqui está um artigo que fala sobre serialização de objetos em .NET: http://www.codeguru.com/Csharp/Csharp /cs_syntax/serialization/article.php/c7201

@ Brian: Eu não sei como as coisas funcionam em Java, mas em objetos .NET obter serializado para baixo para XML, não base64 cordas. O webservice publica um arquivo WSDL que contém as definições de métodos e objetos necessários para o seu webservice.

Espero que ninguém cria webservices que simplesmente criar uma string base64

Daniel Auger:
Como já foi dito, é possível. No entanto, se tanto o serviço ea cliente usar um objeto que tem o exatamente o mesmo comportamento de domínio em ambos os lados, você provavelmente não precisa de um serviço em primeiro lugar.

lomax: Eu tenho que discordar com isso, pois de um comentário um pouco estreita. Usando um webservice esse domínio pode serializar objetos aos meios XML que torna fácil para os clientes que trabalham com o mesmo domínio objetos, mas também significa que esses clientes estão restritos a usando esse serviço web em particular você já expostos e também funciona em inverter, permitindo a outros clientes não têm conhecimento do seu domínio objetos, mas ainda interagir com o seu serviço via XML.

@ Lomax: Você descreveu dois cenários. Cenário 1: O cliente é reidratar a mensagem de volta xml em exatamente o mesmo objeto de domínio. Eu considero que este seja "retornando um objeto". Na minha experiência, esta é uma má escolha e eu vou explicar isso abaixo. Cenário 2: O cliente hidrata a mensagem XML em algo que não seja exata do objeto mesmo domínio: Estou 100% por trás disso, no entanto eu não considero que isso seja retornando um objeto de domínio. É realmente enviar uma mensagem ou DTO.

Agora, deixe-me explicar por que true / puro / não DTO serialização de objetos através de um serviço web é normalmente uma má idéia. Uma afirmação: a fim de fazer isso, em primeiro lugar, você tem que ser o proprietário de tanto o cliente quanto o serviço, ou fornecer ao cliente com uma biblioteca de usar para que eles possam hidratar o objeto de volta para ele do tipo verdadeiro. O problema: O objecto de domínio como um tipo já existe em que pertence a dois domínios semi-relacionados. Com o tempo, os comportamentos podem precisar de ser adicionado em um domínio que não fazem sentido no outro domínio e isso leva a poluição e problemas potencialmente dolorosas.

Eu normalmente usam o cenário 2. Eu só uso o cenário 1, quando há uma razão esmagadora para fazê-lo.

Peço desculpas por ser tão concisa com a minha resposta inicial. Espero que este apura as coisas a um grau tão longe como o que minha opinião é. Lomax, parece que metade concordam;).

JSON é uma forma bastante normal passar objetos ao redor da web (como um subconjunto de javascript). Muitas línguas possuem uma biblioteca que irá converter o código JSON em um objeto nativo - ver, por exemplo simplejson em Python .

Para mais bibliotecas para uso JSON, consulte a JSON webpage

Como já foi dito, é possível. No entanto, se tanto o serviço e uso do cliente um objeto que tem o mesmo comportamento domínio exato em ambos os lados, você provavelmente não precisa de um serviço em primeiro lugar.

Como já foi dito, é possível. No entanto, se tanto o serviço ea cliente usar um objeto que tem o exatamente o mesmo comportamento de domínio em ambos os lados, você provavelmente não precisa de um serviço em primeiro lugar.

Eu tenho que discordar com isso, pois é um comentário um pouco estreita. Usando um webservice que pode serializar objetos de domínio aos meios XML que torna mais fácil para os clientes que trabalham com os mesmos objetos de domínio, mas isso também significa que os clientes estão restritos ao uso de que determinado serviço web que você expostos e também funciona em reversa, permitindo que outros clientes não ter conhecimento de seus objetos de domínio, mas ainda interagir com o seu serviço via XML.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top