2011-08-31 28 views
12

Tôi tìm thấy các thuộc tính [DataContract][DataMember] có chút lộn xộn và muốn thực hiện điều này bằng mã trong phương thức cấu hình hoặc thứ gì đó. Điều này có thể không?Đặt DataContract và DataMember Nếu không có tất cả các thuộc tính

+4

Điều gì lộn xộn về trang trí trả trước? –

+0

Không chắc chắn cách trả lời. Chỉ lộn xộn thôi. –

+3

Tôi có rất nhiều thực thể và đối với hầu hết các phần tôi muốn mở rộng tất cả chúng bao gồm tất cả các thuộc tính, do đó, nó chỉ cảm thấy cồng kềnh để lặp lại một thuộc tính hàng trăm lần. Tôi hy vọng sẽ tìm ra cách tiếp cận "chọn không tham gia" mà Ladislov đang giúp tôi với bên dưới. Tôi muốn trang trí cho các thành viên mà tôi không muốn bao gồm. –

Trả lời

14

Bạn không phải sử dụng các thuộc tính này chút nào. DataContractSerializer sẽ tuần tự hóa tất cả các thuộc tính công khai với getter và setter nhưng trong trường hợp serializing thực thể với các thuộc tính dẫn hướng, bạn sẽ dễ dàng kết thúc với ngoại lệ do "tham chiếu cyclic".

Để tránh ngoại lệ đó, bạn phải sử dụng [DataContract(IsReference = true)] trên lớp tổ chức của mình với DataMember trên mọi thuộc tính bạn muốn serilize hoặc IgnoreDataMember trên mọi thuộc tính bạn không muốn sắp xếp theo thứ tự.

Tùy chọn cuối cùng và phức tạp nhất là tránh các thuộc tính hoàn toàn và các lớp tùy chỉnh triển khai IDataContractSurrogate để kiểm soát việc tuần tự hóa bên ngoài loại.

Bạn cũng có thể viết quy trình tuần tự hóa hoàn toàn tùy chỉnh của mình hoặc sử dụng tuần tự hóa XML hoặc tuần tự hóa nhị phân với tất cả các yêu cầu của nó.

+2

Nhưng tôi thêm [DataContract] vào lớp của mình và tôi có thể trả lại từ một hoạt động WCF ... nhưng nội dung trống, vì vậy tôi thêm [DataMember] vào một vài thuộc tính và đột nhiên những cái đó (và chỉ những cái đó) được trả lại trong kết quả tuần tự. Vậy tại sao tôi không làm việc như bạn nói ở đâu theo mặc định tất cả các thuộc tính được trả về? –

+0

BTW, chúng là tài sản công cộng với {get; set;} –

+5

Khi bạn thêm thuộc tính 'DataContract', bạn ** phải ** đánh dấu các thuộc tính bạn muốn tuần tự hóa với thuộc tính' DataMember'. Tuần tự hóa mặc định mà tôi mô tả chỉ hoạt động nếu bạn không sử dụng thuộc tính 'DataContract'. –

1

Không, DataContractSerializer là một bộ nối tiếp chọn tham gia - bạn phải nói với nó những gì bạn muốn đưa vào.

Với các trình nối tiếp khác, bạn cần phải sử dụng những thứ như NonSerializedAttribute hoặc XmlIgnoreAttribute để thông báo cho trình nối tiếp rời khỏi mọi thứ.

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