2009-12-28 12 views

risposta

8

Sì, è possibile fornire una propria implementazione serializzatore. Per impostazione predefinita, WCF utilizzerà lo DataContractSerializer. Per fornire il proprio serializzatore, è necessario scrivere il proprio IOperationBehavior che cerca e rimuove lo DataContractSerializerOperationBehavior correntemente applicato dalla raccolta OperationDescription::Behaviors e quindi applica un'istanza personalizzata di DataContractSerializerOperationBehavior. DataContractSerializerOperationBehavior è quindi responsabile della creazione di un'implementazione XmlObjectSerializer nei suoi metodi di fabbrica CreateSerializer. Per alcuni esempi di codice su come eseguire questa operazione, check out this article by Dan Rigsby.

Da lì, si tratta di implementare la propria personalizzazione XmlObjectSerializer che consente di serializzare l'infoset XML a qualsiasi rappresentazione desiderata.

+0

Ciao Drew, Ma il mio serializzatore deve essere derivato da una classe base o implementare alcuni interfacce. Se la risposta è sì, quali sono questi? Il serializzatore deve essere una sorta di xmlserializer? Ho scritto un serializzatore che serializza i tipi come byte. – mkus

+0

È necessario ereditare da XmlObjectSerializer e fornire un'implementazione personalizzata per i vari metodi. –

+0

Questa è una domanda precedente, ma penso che dovrei aggiungere che questo articolo di msdn mette in guardia contro la modifica di OperationDescription da un metodo IOperationBehavior http://msdn.microsoft.com/en-us/library/system.servicemodel.description.ioperationbehavior. aspx. – insipid

2

Normalmente si posiziona l'attributo [DatacontractSerializer] o [XmlSerializer] di sopra del Contratto di Servizio, im abbastanza sicuro che si potrebbe creare il proprio da qui il motivo per cui li si applica come attributi, ora se solo reflector sarebbe iniziare in modo che potessi controllare la XmlSerializer e scoprire cosa lo rende perfetto.

msdn insistono sul fatto che le classi che vogliono essere serializzato attraverso il XmlSerializer, devono essere decorate con [XmlAttribute] o [XmlElement] attributi (in quanto sarebbe dare più forma per il file xml con comprensione), ma funziona se le classi sono decorate con la [DataMember], che è compatibile con DataContractSerializer, quindi, perché si dovrebbe essere in grado di creare il proprio serializzatore che serializzare qualsiasi cosa con un tag [DataMember], proprio come il XmlSerializer

3

Il team di WCF ha fatto ciò quando ha introdotto DataContractJsonSerializer.

Ci sono lontano più punti di contatto di quelli qui menzionati nelle altre due risposte - per esempio potrebbe essere necessario introdurre e modificare i comportamenti di funzionamento e formattatori di funzionamento in uso, aggiungere un nuovo encoder, e aggiungere tutto nuovo anche i comportamenti di servizio e client. Dipende da cosa è il nuovo formato di serializzazione e cosa stai cercando di fare.

Tuttavia, se l'obiettivo è aggiungere solo un nuovo serializzatore per la serializzazione autonoma, è più semplice.

Quello che mi sento di raccomandare è: esaminare tutto il diverso utilizzo di DataContractJsonSerializer (tramite Reflector) in System.Runtime.Serialization.dll, System.ServiceModel.Web.dll e System.Runtime.ServiceModel.dll.

Se ti interessa solo l'aspetto di serializzazione autonomo, guarda il DataContractJsonSerializer e le classi associate nello spazio dei nomi di serializzazione. Dovrebbe essere abbastanza intuitivo per te comprendere le varie sottigliezze dell'implementazione della serializzazione personalizzata. Chiedi se hai domande specifiche, ma credo davvero che questo sia il modo più veloce ed elegante per imparare questa particolare soluzione ...

Problemi correlati