2010-02-02 32 views
9

Tôi có lớp này:Có cách nào để tránh XmlSerializer không khởi tạo một thuộc tính null khi deserializing?

public class MySerializableClass 
{ 
    public List<MyObject> MyList { get; set; } 
} 

Nếu MyList là null khi MySerializableClass là đăng, tôi cần phải có nó null khi nó deserialised quá, nhưng XmlSerializer luôn khởi nó khi nó deserialises lớp học của tôi.

Có cách nào để tránh nó khởi tạo các thuộc tính không?

Danh sách của tôi thậm chí không được ghi trong tệp được tuần tự khi nó không có giá trị. Khi tôi tải nó với giá trị null, và lưu nó một lần nữa, MyList không phải là null nữa, nó được tuần tự hóa thành một Danh sách <> với 0 mục, nhưng không phải là null.

Cảm ơn.

Thông tin thêm:

tài sản

Một IsDeserializing là không khả thi do một số hạn chế mã trong cấu trúc của lớp

+0

Wow, System.Xml không bao giờ nắm bắt để tôi ngạc nhiên. Có một setter công cộng cho một thành viên lớp sưu tập là * rất * bất thường, xem xét thiết kế của bạn để xác minh đó là những gì bạn thực sự muốn. Nó hoạt động tốt mà không có một setter. –

+2

Nó không phải là những gì tôi thực sự muốn. Đó là những gì serializer muốn. Nếu tôi thực hiện hoặc nhận được hoặc thiết lập riêng, deserializer sẽ thất bại. – Carlo

Trả lời

8

này trông giống như một lỗi ...

Ngay cả khi bạn cố gắng để đánh dấu tài sản là nullable, nó dường như không hoạt động.

[XmlArray(IsNullable = true)] 
public List<MyObject> MyList { get; set; } 

Nó serializes tài sản MyList như sau:

<MyList xsi:nil="true" /> 

Vì vậy, XML rõ ràng chỉ ra rằng danh sách này là vô giá trị, nhưng sau khi deserialization, nó vẫn khởi tạo một danh sách trống ...

Nếu bạn thay thế List<MyObject> bằng MyObject[], nó hoạt động tốt (thậm chí không có IsNullable = true), nhưng nó có thể không phải là những gì bạn muốn ...

Bạn có thể báo cáo điều này trên Connect.

+1

Khi bạn đã báo cáo lỗi, hãy chỉnh sửa câu hỏi của bạn để bao gồm URL của báo cáo lỗi. Điều đó sẽ cho phép người khác bỏ phiếu cho lỗi này. –

+1

Vui lòng bỏ phiếu và thêm một số bình luận tại đây https://connect.microsoft.com/VisualStudio/feedback/details/687096/xmlserializer-initializes-a-list-khi-it-should-not –

0

Không sử dụng Thuộc tính được tự động triển khai nếu bạn cần null ở đó. sử dụng ví dụ:

public class MySerializableClass 
{ 
    List<MyObject> myList 
    public List<MyObject> MyList { get {return myList;} set {myList = value;} } 
} 
+1

Không khắc phục được sự cố, hãy thử. –

+0

Vâng, tôi thực sự có nó như thế này, tôi đơn giản hóa nó cho ví dụ, nhưng cảm ơn cho đề nghị. – Carlo

0

tôi đã cùng một vấn đề nhưng thêm XmlArrayAttribute đến tài sản không có gì thiết lập đã làm cho nó làm việc cho tôi

public class MySerializableClass 
{ 
    [XmlArray] 
    public List<MyObject> MyList { get; set; } 
} 
+0

Không phù hợp với tôi! –

0

Nếu bạn thêm một tài sản với tên * PropertyName * rõ như một boolean sự XmlSerializer sẽ chỉ hiển thị thẻ cho danh sách khi nó đúng.

Ví dụ:

public class MySerializableClass 
{ 
    public List<MyObject> MyList { get; set; } 

    [XmlIgnore] 
    public bool MyListSpecified { get; set; } 
} 
+0

Không hoạt động, đã thử trong 4.0 – annakata

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