Nel mio web method
, ottengo un oggetto di classe di classe C# di terze parti. La classe entità non è altro che DataContract
. Questa classe di entità è piuttosto complessa e ha proprietà di vario tipo, alcune proprietà sono anche raccolte. Naturalmente, quei tipi collegati sono anche DataContracts.Linq a Xml VS XmlSerializer VS DataContractSerializer
Desidero serializzare quell'entità DataContract in XML come parte della business logic del mio servizio web. Non posso usare direttamente DataContractSerializer
(sull'oggetto che ricevo nel metodo web) semplicemente perché lo schema XML è del tutto diverso. Quindi l'XML generato da DataContractSerializer non verrà convalidato rispetto allo schema.
Non sono in grado di concludere l'approccio che dovrei seguire per l'implementazione. Mi veniva in mente seguenti approcci di implementazione:
LINQ to XML - Questo sembra ok, ma ho bisogno di creare albero XML (vale a dire gli elementi o rappresentazione XML del l'istanza della classe) manualmente per ogni tipo di oggetto. Dato che ci sono molte classi di entità e sono collegate tra loro, penso che sia troppo lavoro per scrivere manualmente gli elementi XML. Inoltre, dovrò continuare a modificare l'albero XML come e quando la classe di entità introduce qualche nuova proprietà. Non solo questo, il codice in cui creo l'albero XML sembrerebbe poco goffo (almeno in apparenza) e sarebbe più difficile da mantenere/cambiare da parte di qualche altro sviluppatore in futuro; lui/lei dovrà guardarlo così da vicino per capire come viene generato quell'XML.
XmlSerializer - posso scrivere le mie classi di entità che rappresentano la struttura XML che voglio. Ora, ho bisogno di copiare i dettagli dall'oggetto in arrivo all'oggetto delle mie classi. Quindi questo è un lavoro aggiuntivo (anche per .NET quando il codice viene eseguito!). Quindi posso usare
XmlSerializer
sul mio oggetto per generare XML. In questo caso, dovrò creare classi di entità e ogni volta che l'entità di terze parti viene modificata, dovrò semplicemente aggiungere nuove proprietà nella mia classe. (con attributi XmlElement o XmlAttibute). Ma la gente consigliaDataContractSerializer
su questo e quindi non voglio finalizzare questo a meno che tutti gli aspetti siano chiari per me.DataContractSerializer - Ancora una volta qui, dovrò scrivere la mia classe di entità in quanto non ho alcun controllo sulle terze parti DataContracts. E ho bisogno di copiare i dettagli dall'oggetto in arrivo all'oggetto delle mie classi. Quindi questo è un lavoro aggiuntivo. Tuttavia, poiché DataContractSerializer non supporta gli attributi Xml, dovrò implementare
IXmlSerializable
e generare l'Xml richiesto nel metodoWriteXml
. DataContractSerializer è più veloce di XmlSerializer, ma di nuovo dovrò gestire le modifiche (in WriteXml) se l'entità di terze parti cambia.
Domande:
- Quale approccio è la cosa migliore in questo scenario considerando le prestazioni troppo?
- Puoi suggerire un approccio migliore?
DataContractSerializer
vale la pena considerare (perché ha prestazioni migliori rispetto aXmlSerilaizer
) quando la classe di entità in entrata è soggetta a modifiche?- Il LINQ può essere realmente utilizzato per la serializzazione? O è davvero buono per le cose diverse dalle query?
- XmlSerializer può essere preferito su LINQ in questi casi? Se sì, perché?
Grazie per aver condiviso il collegamento. La soluzione fornita non è utile per il mio problema ma ha aiutato a conoscere un altro modo per usare LINQ! – Learner