W moim web method
, otrzymuję obiekt klasy C# strony trzeciej. Klasa encji to nic innego jak DataContract
. Ta klasa encji jest dość złożona i ma właściwości różnych typów, niektóre właściwości są również kolekcjami. Oczywiście te powiązane typy to także Kontakty danych.Linq do Xml VS XmlSerializer VS DataContractSerializer
Chcę serializować tę encję DataContract na XML jako część logiki biznesowej mojej usługi internetowej. Nie mogę użyć bezpośrednio kodu DataContractSerializer
(na obiekcie, który otrzymuję w metodzie internetowej), ponieważ schemat XML jest zupełnie inny. W związku z tym XML generowany przez DataContractSerializer nie zostanie zweryfikowany względem schematu.
Nie jestem w stanie zakończyć podejścia, które powinienem zastosować w celu wdrożenia. Mogę myśleć o następujących metod wdrażania:
LINQ to XML - To wygląda ok, ale trzeba utworzyć drzewo XML (to znaczy elementy lub reprezentacji XML instancji klasy) ręcznie dla każdego rodzaju obiektu. Ponieważ istnieje wiele klas jednostek i są ze sobą powiązane, myślę, że to zbyt dużo pracy, aby ręcznie pisać elementy XML. Poza tym będę musiał dalej modyfikować drzewo XML, kiedy klasa encji wprowadzi jakąś nową właściwość. Nie tylko to, kod generowania drzewa XML wyglądałby trochę niezgrabnie (przynajmniej w wyglądzie) i byłby trudniejszy do utrzymania/zmiany przez jakiegoś innego programistę w przyszłości; on/ona będzie musiał przyjrzeć się tak dokładnie, aby zrozumieć, jak generowany jest ten XML.
XmlSerializer - Mogę pisać własne podmiot klas, które reprezentują strukturę XML chcę. Teraz muszę skopiować szczegóły z przychodzącego obiektu do obiektu moich własnych klas. To jest dodatkowa praca (dla .NET również po wykonaniu kodu!). Następnie mogę użyć
XmlSerializer
na moim obiekcie do wygenerowania XML. W takim przypadku będę musiał utworzyć klasy jednostek, a gdy jednostka zewnętrzna zostanie zmodyfikowana, będę musiał dodać nową właściwość w mojej klasie. (z atrybutami XmlElement lub XmlAttibute). Ale ludzie polecająDataContractSerializer
nad tym, więc nie chcę tego finalizować, chyba że wszystkie aspekty są dla mnie jasne.DataContractSerializer - Znowu tutaj, będę musiał napisać własną klasę encji ponieważ mam żadnej kontroli nad DataContracts osób trzecich. I muszę skopiować szczegóły z przychodzącego obiektu do obiektu moich własnych klas. To jest dodatkowa praca. Jednak ponieważ DataContractSerializer nie obsługuje atrybutów Xml, będę musiał zaimplementować
IXmlSerializable
i wygenerować wymagany Xml w metodzieWriteXml
. DataContractSerializer jest szybszy niż XmlSerializer, ale znowu będę musiał obsłużyć zmiany (w WriteXml), jeśli zmieni się podmiot zewnętrzny.
Pytania:
- które podejście jest najlepsze w tym scenariuszu, biorąc pod uwagę wydajność też?
- Czy możesz zaproponować lepsze podejście?
- Czy warta rozważenia jest
DataContractSerializer
(ponieważ ma lepszą wydajność niżXmlSerilaizer
), gdy klasa przychodzącego obiektu może ulec zmianie? - Czy LINQ powinien być naprawdę używany do serializacji? Czy jest to naprawdę dobre dla rzeczy innych niż zapytanie?
- Czy XmlSerializer może być preferowany zamiast LINQ w takich przypadkach? Jeśli tak, dlaczego?
Dzięki za udostępnienie linku. Dostarczone tam rozwiązanie nie jest przydatne dla mojego problemu, ale pomogło poznać jeszcze jeden sposób korzystania z LINQ! – Learner