2012-03-20 23 views
8

Tôi bối rối với hành vi của DataContractSerializer. Cấu hình của chúng tôi dựa trên XML. XML được sử dụng làm nguồn cho phương thức DataContractSerializer.ReadObject. Gần đây tôi đã gặp phải một vấn đề khi một số thuộc tính của đối tượng deserialized đã không được thiết lập. Tôi đã theo dõi các thay đổi và phát hiện ra rằng các thuộc tính đó đã được thêm vào XML theo cách thủ công. Đó là OK theo ý kiến ​​của tôi. Dường như nó không được chấp nhận trong quan điểm của DataContractSerializer vì nó xuất hiện nó trông đợi các nút XML được sắp xếp theo thứ tự bảng chữ cái. Có thật không?! Deserialization có vẻ như điều thực sự đơn giản - đọc XML tuần tự, phân tích tên nút, đặt thuộc tính tương ứng. Mục đích của việc đặt hàng là gì?DataContract deserialization không thành công do thứ tự không chính xác của các nút XML

Có cách giải quyết khác không? Có lẽ một số loại cài đặt cho DataContractSerializer?

Trả lời

3

Tôi gặp sự cố này gần đây. Để làm việc xung quanh nó, tôi đã sử dụng XmlSerializer và loại bỏ thứ tự rõ ràng từ XmlElement thuộc tính:

set proxy_tool="C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SvcUtil.exe" /nologo /t:code /ser:XmlSerializer /UseSerializerForFaults 
set sed_tool="$(ProjectDir)sed.exe" -r -i "s/,?[[:space:]]*Order=[[:digit:]]+//" 

%proxy_tool% /o:"Proxy1.cs" /n:*,Namespaces.Name1 "Proxy1.wsdl" 
%sed_tool% "Proxy1.cs" 

%proxy_tool% /o:"Proxy2.cs" /n:*,Namespaces.Name2 "Proxy2.wsdl" 
%sed_tool% "Proxy2.cs" 

... 

Có một số more information on my blog post.

Nếu bạn muốn biết tại sao thứ tự lại quan trọng, đó là vì sequence trong XSD có thứ tự xác định và hợp đồng dịch vụ web được xác định bằng XSD.

Từ the specification:

Hậu quả của định nghĩa này là bất kỳ yếu tố xuất hiện trong một ví dụ có loại được tuyên bố là USAddress (ví dụ shipTo trong po.xml) phải bao gồm năm yếu tố và một thuộc tính. Các phần tử này phải được gọi là tên, đường phố, thành phố, tiểu bang và mã zip như được chỉ định bởi các giá trị thuộc tính tên khai báo, và các phần tử phải xuất hiện trong cùng một chuỗi (thứ tự) mà chúng được khai báo.

+0

Wow ... Điều đó có vẻ hơi phức tạp. Nhưng cảm ơn câu trả lời. Tôi đã kết thúc thử DataContractSerializer và nó làm việc cho tôi tốt hơn. – Schultz9999

+0

Không có cách nào có thể sử dụng định nghĩa "xs: all" trong DataContract? Vì vậy, sau đó đặt hàng không quan trọng? – Nicholi

+0

@Nicholi Có lẽ nếu bạn có quyền kiểm soát WSDL –

3

Bạn có thể sử dụng thành viên Order của DataMemberAttribute để trợ giúp điều này, nhưng trong hầu hết các trường hợp: XML là đơn đặt hàng cụ thể (đối với các phần tử, không phải thuộc tính) - vì vậy nó không phải là cụ thể sai.

Điều đó nói rằng: nếu bạn muốn kiểm soát tốt đối với xê-ri hóa XML, DataContractSerializer là một lựa chọn nghèo XmlSerializer cung cấp nhiều quyền kiểm soát hơn - và ít bị quấy rầy trật tự iirc.

+0

Tôi thấy quan điểm của bạn. Tôi đoán tôi đang lười biếng trong trường hợp này bởi vì cùng một đối tượng được sử dụng như một tham số để WCF dựa trên dịch vụ vì vậy nó là loại thuận tiện không phải suy nghĩ về hai cách serialization. – Schultz9999

Các vấn đề liên quan