Trong web method
của tôi, tôi nhận được một đối tượng của một số bên thứ ba C# lớp thực thể. Lớp thực thể không là gì ngoài số DataContract
. Lớp thực thể này khá phức tạp và có các thuộc tính của các kiểu khác nhau, một số thuộc tính cũng là các bộ sưu tập. Tất nhiên, những loại liên kết này cũng là DataContracts.LINQ to Xml VS XmlSerializer VS DataContractSerializer
Tôi muốn tuần tự hóa thực thể DataContract đó thành XML như một phần của logic nghiệp vụ của dịch vụ web của tôi. Tôi không thể sử dụng trực tiếp DataContractSerializer
(đối tượng tôi nhận được trong phương thức web) đơn giản vì lược đồ XML hoàn toàn khác nhau. Vì vậy, XML được tạo ra bởi DataContractSerializer sẽ không được xác nhận đối với lược đồ.
Tôi không thể kết luận cách tiếp cận mà tôi nên tuân theo để triển khai. Tôi có thể nghĩ ra phương pháp thực hiện như sau:
LINQ to XML - Điều này có vẻ ok nhưng tôi cần phải tạo ra cây XML (ví dụ: các yếu tố hoặc đại diện XML của dụ lớp) bằng tay đối với từng loại đối tượng. Vì có nhiều lớp thực thể và chúng được liên kết với nhau, tôi nghĩ rằng đây là quá nhiều công việc để viết các phần tử XML theo cách thủ công. Bên cạnh đó, tôi sẽ phải tiếp tục sửa đổi cây XML và khi lớp thực thể giới thiệu một số thuộc tính mới. Không chỉ điều này, mã mà tôi tạo ra cây XML sẽ trông hơi vụng về (ít nhất là về ngoại hình) và sẽ khó duy trì/thay đổi bởi một số nhà phát triển khác trong tương lai; anh ta/cô ấy sẽ phải xem xét nó rất chặt chẽ để hiểu cách XML được tạo ra.
XmlSerializer - Tôi có thể viết các lớp thực thể riêng của mình đại diện cho cấu trúc XML mà tôi muốn. Bây giờ, tôi cần phải sao chép chi tiết từ đối tượng đến đối tượng của các lớp của riêng tôi. Vì vậy, đây là công việc bổ sung (cho .NET quá khi thực thi mã!). Sau đó, tôi có thể sử dụng
XmlSerializer
trên đối tượng của mình để tạo XML. Trong trường hợp này, tôi sẽ phải tạo các lớp thực thể và bất cứ khi nào thực thể bên thứ ba được sửa đổi, tôi sẽ phải thêm thuộc tính mới trong lớp của tôi. (với các thuộc tính XmlElement hoặc XmlAttibute). Nhưng mọi người khuyên bạn nênDataContractSerializer
trong phần này và vì vậy tôi không muốn hoàn thành việc này trừ khi tất cả các khía cạnh đều rõ ràng với tôi.DataContractSerializer - Một lần nữa, tôi sẽ phải viết lớp thực thể của riêng mình vì tôi không kiểm soát được DataContracts của bên thứ ba. Và tôi cần phải sao chép chi tiết từ đối tượng đến đối tượng của các lớp học của riêng tôi. Đây là công việc bổ sung. Tuy nhiên, vì DataContractSerializer không hỗ trợ các thuộc tính Xml, tôi sẽ phải triển khai
IXmlSerializable
và tạo Xml theo yêu cầu trong phương thứcWriteXml
. DataContractSerializer nhanh hơn XmlSerializer, nhưng một lần nữa tôi sẽ phải xử lý các thay đổi (trong WriteXml) nếu thực thể của bên thứ ba thay đổi.
Câu hỏi:
- phương pháp nào là tốt nhất trong kịch bản này xem xét hiệu suất quá?
- Bạn có thể đề xuất một số cách tiếp cận tốt hơn không?
- Có phải xem xét
DataContractSerializer
(vì nó có hiệu suất tốt hơn trênXmlSerilaizer
) khi lớp thực thể đến có thể thay đổi không? - LINQ có nên thực sự được sử dụng để tuần tự hóa không? Hoặc là nó thực sự tốt cho những thứ khác hơn là truy vấn?
- XmlSerializer có thể được ưu tiên hơn LINQ trong những trường hợp như vậy không? Nếu đúng thì tại sao?
Cảm ơn bạn đã chia sẻ liên kết. Các giải pháp được cung cấp ở đó không hữu ích cho vấn đề của tôi nhưng nó đã giúp để biết thêm một cách để sử dụng LINQ! – Learner