13

Tôi gặp sự cố khi deserializing một số XML; XML do bên thứ ba cung cấp khá chi tiết, vì vậy nếu không có giá trị được đặt cho một phần tử cụ thể, nó sẽ cung cấp và phần tử trống (ví dụ: <element1 />).Sử dụng đồ trang trí XML để chỉ định giá trị mặc định trong quá trình de-serialization

Đây là vấn đề đối với một số thành phần nhất định, ví dụ: những yếu tố có nghĩa là lưu trữ số nguyên. Tôi có quyền kiểm soát đối với bên thứ ba, vì vậy tôi có thể yêu cầu họ chỉ định giá trị mặc định (<myinteger>0</myinteger>) hoặc tôi có thể khiến họ bỏ qua hoàn toàn các yếu tố này. Cả hai đều nên tránh vấn đề.

Tuy nhiên, có thể có các tình huống trong tương lai, nơi chúng tôi không có nhiều quyền kiểm soát - trong trường hợp nào, có cách xác định, có thể thông qua trang trí, giá trị mặc định không?

[XmlElement("myinteger")=0???] 
    public int MyInteger 
    { 
     get 
     { 
      return myInteger; 
     } 
     set 
     { 
      myInteger= value; 
     } 
    } 

Trả lời

32

XmlSerializerkhông hỗ trợ [DefaultValue], nhưng nó sử dụng nó trong quá serialization. Trong thời gian deserialization, nó chỉ đơn giản là chạy các nhà xây dựng, sau đó có giá trị đến và áp dụng chúng. Một cách tiếp cận thông thường, sau đó, là sử dụng các nhà xây dựng (hoặc trường-initializers):

public Foo() { 
    Bar = 4; 
} 
[DefaultValue(4), XmlAttribute("bar")] 
public int Bar {get;set;} 

Tuy nhiên; Giải thích của XmlSerializer về điều này không phải là "cung cấp một phần tử trống" - mà là "bỏ qua phần tử (/ thuộc tính)". Thậm chí int? không ánh xạ tới "trống". Để xử lý các phần tử rỗng, bạn sẽ phải xử lý nó như một chuỗi. Đó là xấu xí.

+1

Hmmmm ... đơn giản nhận được bên thứ ba bỏ qua các phần tử trống của mô tả có vẻ là giải pháp đơn giản nhất. Tôi chỉ tò mò những gì tôi có thể làm, nơi tôi không có sự sang trọng của sự lựa chọn đó. Tôi đã xem xét các tùy chọn chuỗi, nhưng nó chỉ là một can lớn của sâu ... – CJM

+0

Có ít nhất một hiệu ứng quan trọng trong quá trình deserialization. Nếu phần tử trống, không có DefaultValue thì có thể có lỗi phân tích cú pháp. Tuy nhiên, với nó, [mã được tạo] (http://msdn.microsoft.com/en-us/library/aa302290.aspx) sẽ bỏ qua phần tử trống. –

0

Trang trí sử dụng [DefaultValue] dường như không phải là giải pháp hoàn chỉnh vì nó không hoạt động luôn. Một giải pháp đơn giản khác (Có thể không được làm sạch)

public string _sourceSubFolderName; 
    [DefaultValueAttribute("")] 
    [XmlElement("SourceSubFolderName")] 
    public string SourceSubFolderName 
    { 
     get { return string.IsNullOrEmpty(_sourceSubFolderName) ? 
       string.Empty : _sourceSubFolderName; } 
     set { _sourceSubFolderName = value; } 
    }