2012-05-10 35 views
7

Tôi đang sử dụng DataContractSerializer để tuần tự hóa một đối tượng thành XML bằng cách sử dụng thuộc tính DataMember (chỉ các thuộc tính công khai được tuần tự hóa).
Có thể tự động bỏ qua một số thuộc tính để chúng không được đưa vào đầu ra XML không?

Ví dụ: để cho phép người dùng chọn các phần tử xml mong muốn trong một số điều khiển danh sách và sau đó chỉ cần tuần tự hóa các yếu tố mà người dùng đã chọn loại trừ tất cả các yếu tố không được chọn.Bỏ qua một số thuộc tính trong thời gian chạy khi sử dụng DataContractSerializer

Cảm ơn

Trả lời

3

Đối với kịch bản danh sách, có lẽ chỉ có một tài sản khác nhau, vì vậy thay vì:

[DataMember] 
public List<Whatever> Items {get {...}} 

bạn có:

public List<Whatever> Items {get {...}} 

[DataMember] 
public List<Whatever> SelectedItems { 
    get { return Items.FindAll(x => x.IsSelected); } 

Tuy nhiên, deserializing đó sẽ là một nỗi đau, như danh sách của bạn sẽ cần phải ăn vào mục; nếu bạn cần deserialize quá, bạn có thể cần phải viết một danh sách tùy chỉnh phức tạp.


Là ý tưởng thứ hai; chỉ cần tạo một thể hiện thứ hai của đối tượng với chỉ các mục mà bạn muốn tuần tự hóa; rất đơn giản và hiệu quả:

var dto = new YourType { X = orig.X, Y = orig.Y, ... }; 
foreach(var item in orig.Items) { 
    if(orig.Items.IsSelected) dto.Items.Add(item); 
} 
// now serialize `dto` 

AFAIK, DataContractSerializer không hỗ trợ serialization có điều kiện của các thành viên.

Tại tài sản cá nhân mức, đây một lựa chọn nếu bạn đang sử dụng XmlSerializer, mặc dù - cho một tài sản, nói rằng, Foo, bạn chỉ cần thêm:

public bool ShouldSerializeFoo() { 
    // return true to serialize, false to ignore 
} 

hay:

[XmlIgnore] 
public bool FooSpecified { 
    get { /* return true to serialize, false to ignore */ } 
    set { /* is passed true if found in the content */ } 
} 

Chúng được áp dụng hoàn toàn như một quy ước dựa trên tên.

+0

Xin cảm ơn, Marc. Vì vậy, ví dụ, nếu tôi có một thể hiện của Danh sách trong đó MyClass có ba thuộc tính X, Y và Z, sẽ chỉ có thể bao gồm các thuộc tính X và Y và bỏ qua Z cho từng mục trong danh sách và sau đó gửi danh sách này đến DataContractSerializer và serializer sẽ chỉ bao gồm X và Y ở đầu ra và bỏ qua Z? Tôi chỉ muốn loại trừ một số thuộc tính cho mọi mục trong danh sách. Điều đó có thể thực hiện được với một số tùy chọn bạn đã chỉ định ở trên không? – Joxi

+1

Trong trường hợp muốn tuần tự hóa 'X' và' Y' nhưng không phải là 'Z'; với DCS chỉ khả dụng (theo như tôi biết) nếu nó áp dụng cho ** tất cả ** các mục, tức là bằng cách chọn '[DataMember]' hoặc '[IgnoreDataMember]' một cách thích hợp; DCS không có tuần tự hóa có điều kiện theo hiểu biết tốt nhất của tôi –

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