Domanda

Invece di restituire una stringa comune, esiste un modo per restituire oggetti classici?Altrimenti:quali sono le migliori pratiche?Trasponi il tuo oggetto in XML e ricostruisci l'oggetto dall'altra parte?Quali sono le altre possibilità?

È stato utile?

Soluzione

Come accennato, puoi farlo in .net tramite serializzazione.Per impostazione predefinita, tutti i tipi nativi sono serializzabili, quindi questo accade automaticamente per te.

Tuttavia, se disponi di tipi complessi, devi contrassegnare l'oggetto con l'attributo [Serializable].Lo stesso vale con i tipi complessi come proprietà.

Quindi ad esempio è necessario avere:

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

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

Altri suggerimenti

Se l'oggetto può essere serializzato in XML e può essere descritto in WSDL, allora sì, è possibile restituire oggetti da un servizio web.

SÌ:in .NET chiamano questa serializzazione, in cui gli oggetti vengono serializzati in XML e quindi ricostruiti dal servizio utilizzatore nel tipo di oggetto originale o in un surrogato con la stessa struttura dati.

Ove possibile, traspongo gli oggetti in XML - questo significa che il servizio Web è più portabile - posso quindi accedere al servizio in qualsiasi lingua, devo solo creare il parser/traspositore di oggetti in quella lingua.

Poiché disponiamo di file WSDL che descrivono il servizio, in alcuni sistemi questo è quasi automatizzato.

(Ad esempio, abbiamo un server scritto in puro Python che sostituisce un server scritto in C, un client scritto in C++/gSOAP e un client scritto in Cocoa/Objective-C.Usiamo soapUI come framework di test, che è scritto in Java).

È possibile restituire oggetti da un servizio Web utilizzando XML.Ma i servizi Web dovrebbero essere indipendenti dalla piattaforma e dal sistema operativo.La serializzazione di un oggetto consente semplicemente di archiviare e recuperare un oggetto da un flusso di byte, ad esempio un file.Ad esempio, puoi serializzare un oggetto Java, convertire quel flusso binario (magari tramite una codifica Base 64 in un campo CDATA) e trasferirlo al client del servizio.

Ma il client sarebbe in grado di ripristinare quell'oggetto solo se fosse basato su Java.Inoltre, è necessaria una copia approfondita per serializzare un oggetto e ripristinarlo esattamente.Le copie profonde possono essere costose.

La soluzione migliore è creare uno schema XML che rappresenti il ​​documento e creare un'istanza di tale schema con le specifiche dell'oggetto.

.NET esegue automaticamente questa operazione con oggetti serializzabili.Sono abbastanza sicuro che Java funzioni allo stesso modo.

Ecco un articolo che parla della serializzazione degli oggetti in .NET:http://www.codeguru.com/Csharp/Csharp/cs_syntax/serialization/article.php/c7201

@Brian:Non so come funzionano le cose in Java, ma in .net gli oggetti vengono serializzati in XML, non in stringhe base64.Il servizio web pubblica un file wsdl che contiene le definizioni di metodo e oggetto richieste per il servizio web.

Spero che nessuno crei servizi web che creino semplicemente una stringa base64

Daniele Auger:
Come altri hanno già detto, è possibile.Tuttavia, se sia il servizio che il client utilizzano un oggetto che ha lo stesso comportamento del dominio su entrambi i lati, probabilmente non hai bisogno di un servizio in primo luogo.

lomax:Devo non essere d'accordo con questo in quanto è un commento un po 'ristretto.L'uso di un servizio web in grado di serializzare gli oggetti di dominio a XML significa che semplifica i clienti che funzionano con gli stessi oggetti di dominio, ma significa anche che quei clienti sono limitati a utilizzare quel particolare servizio web in cui hai esposto e funziona anche Invertire consentendo ad altri clienti di non conoscere gli oggetti del tuo dominio, ma interagiscono comunque con il tuo servizio tramite XML.

@Lomax:Hai descritto due scenari. Scenario 1: Il client sta reidratando il messaggio xml nello stesso identico oggetto dominio.Considero questo come "restituire un oggetto".Nella mia esperienza questa è una cattiva scelta e lo spiegherò di seguito. Scenario 2: Il client reidrata il messaggio xml in qualcosa di diverso dallo stesso identico oggetto di dominio:Sono d'accordo al 100%, tuttavia non considero che questo restituisca un oggetto di dominio.Sta davvero inviando un messaggio o DTO.

Ora lasciami spiegare perché la serializzazione di oggetti DTO vera/pura/non in un servizio Web è Generalmente una cattiva idea.Un'affermazione:per fare ciò in primo luogo, devi essere il proprietario sia del client che del servizio, oppure fornire al client una libreria da utilizzare in modo che possa reidratare l'oggetto nel suo vero tipo.Il problema:Questo oggetto dominio come tipo ora esiste e appartiene a due domini semi-correlati.Nel corso del tempo, potrebbe essere necessario aggiungere comportamenti in un ambito che non hanno senso nell’altro e questo porta all’inquinamento e a problemi potenzialmente dolorosi.

Di solito per impostazione predefinita utilizzo lo scenario 2.Utilizzo lo scenario 1 solo quando c'è una ragione schiacciante per farlo.

Mi scuso per essere stato così conciso nella mia risposta iniziale.Spero che questo chiarisca le cose in una certa misura per quanto riguarda la mia opinione.Lomax, sembrerebbe che siamo d'accordo a metà ;).

JSON è un modo piuttosto standard per passare oggetti sul Web (come sottoinsieme di Javascript).Molte lingue dispongono di una libreria che converte il codice JSON in un oggetto nativo, vedi ad esempio simplejson in Pitone.

Per ulteriori librerie per l'utilizzo di JSON, consultare il file Pagina Web JSON

Come altri hanno già detto, è possibile.Tuttavia, se sia il servizio che il client utilizzano un oggetto che ha esattamente lo stesso comportamento del dominio su entrambi i lati, probabilmente non avevi bisogno di un servizio.

Come altri hanno già detto, è possibile.Tuttavia, se sia il servizio che il client utilizzano un oggetto che ha lo stesso comportamento del dominio su entrambi i lati, probabilmente non hai bisogno di un servizio in primo luogo.

Non sono d'accordo con questo perché è un commento un po' ristretto.L'utilizzo di un servizio Web in grado di serializzare oggetti di dominio in XML significa che semplifica i client che lavorano con gli stessi oggetti di dominio, ma significa anche che tali client sono limitati a utilizzare quel particolare servizio Web che hai esposto e funziona anche in invertire consentendo ad altri client di non avere alcuna conoscenza degli oggetti del tuo dominio ma di interagire comunque con il tuo servizio tramite XML.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top