2012-03-13 13 views
7

Cách đơn giản nhất mà tôi nhận được ServiceStack xml deserialization để hoạt động là khi xml chứa một vùng tên. Tuy nhiên, xml tôi nhận được không chứa các không gian tên. Ví dụ làm việc đơn giản nhất:XML deserializing chỉ hoạt động với không gian tên trong xml

[Serializable] 
public class test 
{ 

} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     string xml="<test xmlns=\"http://schemas.datacontract.org/2004/07/\"></test>"; 
     var result = ServiceStack.Text.XmlSerializer.DeserializeFromString<test>(xml); 
    } 
} 

Tuy nhiên, đó không phải là điều tôi muốn. Tôi muốn những điều sau đây để deserialize, vì đó là xml tôi nhận được từ một số dịch vụ:

string xml="<test></test>"; 

Nhưng điều đó mang lại cho tôi những lỗi sau:

DeserializeDataContract: Error converting type: Error in line 1 position 7. 
Expecting element 'test' from namespace 
'http://schemas.datacontract.org/2004/07/'.. 
Encountered 'Element' with name 'test', namespace ''. 

tôi đã cố gắng:

[Serializable] 
[XmlRoot("test", Namespace = "")] 
public class test 

Tôi không thể tạo một Serializer mới, vì ServiceStack.Text.XmlSerializer là tĩnh. Tôi cần phải chọn cho Microsoft XmlSerializer OR ServiceStack (không phải cả hai). Có nghĩa là: nếu tôi không thể lấy ví dụ đơn giản này để làm việc, tôi cần bỏ qua một phần rất hữu ích khác của gói ServiceStack. Điều cuối cùng tôi muốn là tiêm một số không gian tên giả trong xml đến.

Trả lời

23

ServiceStack sử dụng Xml DataContractSerializer NET để serialize XML để loại bỏ Namespaces bạn cần phải hoặc thiết lập các không gian tên cho một chuỗi rỗng với:

[DataContract(Namespace="")] 
public class test { ... } 

Nhưng sau đó bạn sẽ phải đánh dấu mỗi thuộc tính bạn muốn serialized với [DataMember] thuộc tính. Một lựa chọn tốt hơn là để xác định một namespace trống cho tất cả các loại dưới # namespace C bằng cách thêm và thuộc tính hội trong Assembly.cs tập tin của bạn, ví dụ:

[assembly: ContractNamespace("", ClrNamespace = "MyServiceModel.DtoTypes")] 

Lưu ý: bạn có thể loại bỏ các [Serializable] thuộc tính - nó không được sử dụng bởi bất kỳ serializers của ServiceStack. Ngoài ra, tất cả các thuộc tính XmlSerializer như [XmlRoot] đều vô ích vì ServiceStack sử dụng DataContractSerializer của .NET không phải là XmlSerializer trước đó của Microsoft.

+0

Cảm ơn! Đó là liên kết còn thiếu mà tôi cần! Tôi bằng cách nào đó không thể tìm thấy các tài liệu thích hợp như thế này cho ServiceStack ... – user1154148

+0

Bất kỳ lý do nào mà bạn không viết trình deserializer XML của riêng bạn? Microsoft dường như chỉ cần loại cấu hình nước sốt ma thuật này để làm cho nó hoạt động, không giống như trình serializer/deserializer JSON của bạn, nó chỉ hoạt động. – JasonD

+0

@ JasonD Vâng tôi không thích NIH'ing không có lý do chính đáng và tôi không thích sử dụng XML. XML DCS của MS cũng khá hiệu quả đối với XML, có rất ít lợi ích cho số lượng công sức cần thiết. – mythz