Custom WCF DataContractSerializer

È ansible sostituire dataContractSerializer in Windows Communication Foundation con il mio serializzatore personale. Se è ansible, come posso ottenerlo?

Sì, è ansible fornire l’implementazione del proprio serializzatore. Per impostazione predefinita, WCF utilizzerà DataContractSerializer . Per fornire il proprio serializzatore, è necessario scrivere il proprio IOperationBehavior che cerca e rimuove il DataContractSerializerOperationBehavior attualmente applicato dalla raccolta OperationDescription::Behaviors e quindi applica un’istanza personalizzata di DataContractSerializerOperationBehavior . DataContractSerializerOperationBehavior è quindi responsabile della XmlObjectSerializer un’implementazione XmlObjectSerializer nei CreateSerializer metodi factory CreateSerializer . Per alcuni esempi di codice su come eseguire questa operazione, consulta questo articolo di Dan Rigsby .

Da lì, si tratta di implementare il proprio XmlObjectSerializer personalizzato che ti permetterà di serializzare l’infoset XML in qualsiasi rappresentazione tu voglia.

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

Ci sono molti più punti di contatto di quelli menzionati qui nelle altre due risposte: ad esempio potresti dover introdurre e modificare i comportamenti dell’operazione e i formattatori di operazione utilizzati, aggiungere un nuovo codificatore e aggiungere anche nuovi comportamenti e comportamenti client . Dipende da cosa è il nuovo formato di serializzazione e cosa stai cercando di fare.

Tuttavia, se il tuo objective è solo aggiungere un nuovo serializzatore per la serializzazione autonoma, è più semplice.

Quello che vorrei raccomandare è – guarda 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 standalone, guarda il DataContractJsonSerializer e le classi associate nello spazio dei nomi Serialization. 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 …

Normalmente si posiziona l’attributo [DatacontractSerializer] o [XmlSerializer] sopra il contratto di servizio, sono abbastanza sicuro che si possa creare il proprio quindi perché li si applicano come attributi, ora se solo il reflector si avvierebbe in modo da poter ispezionare XmlSerializer e scoprire cosa fa tic tac.

msdn insiste sul fatto che le classi che vogliono essere serializzate tramite XmlSerializer, devono essere decorate con [XmlAttribute] o [XmlElement] (dato che darebbe più forma al file xml in modo comprensibile), ma funziona se le classi sono decorate con il [DataMember] , che è compatibile con DataContractSerializer, quindi perché dovresti essere in grado di creare il tuo serializzatore che serializzerà qualsiasi cosa con un tag [DataMember], proprio come XmlSerializer