Làm cách nào tôi có thể bỏ qua một thuộc tính khi tuần tự hóa bằng DataContractSerializer?


125

Tôi đang sử dụng .NET 3.5SP1 và DataContractSerializer để tuần tự hóa một lớp. Trong SP1, họ đã thay đổi hành vi để bạn không phải bao gồm các thuộc tính DataContract / DataMember trên lớp và nó sẽ chỉ tuần tự hóa toàn bộ. Đây là hành vi tôi đang sử dụng, nhưng bây giờ tôi cần bỏ qua một thuộc tính từ bộ tuần tự. Tôi biết rằng một cách để làm điều này là thêm thuộc tính DataContract vào lớp và chỉ cần đặt thuộc tính DataMember trên tất cả các thành viên mà tôi muốn đưa vào. Tuy nhiên, tôi có lý do rằng điều này sẽ không hiệu quả với tôi.

Vì vậy, câu hỏi của tôi là, có thuộc tính hoặc thứ gì đó tôi có thể sử dụng để làm cho DataContractSerializer bỏ qua thuộc tính không?

Câu trả lời:


176

5
Lớp miền của tôi không có tham chiếu lắp ráp thích hợp, sau đó tôi đã đọc nhầm tài liệu và cuối cùng nghĩ rằng đó là một tính năng mới của .NET 4.5. Đã cố gắng tìm lại chủ đề này để xóa bình luận của tôi nhưng không thành công (đã vội vàng). Hơn nữa, nhìn vào ngày tháng của câu trả lời này chắc đã rung lên hồi chuông .... 2009 .NET 4.5 post ...) Xin lỗi vì đã làm mất thời gian của bạn.
Pluc

2
Trên .NET 4.5 ở đây: System.Runtime.Serialization.IgnoreDataMemberAttribute làm việc cho bất cứ điều gì
Spark

1
Ngay cả các thư viện của bên thứ 3 cũng đã hỗ trợ thêm cho [ignoreDataMember], như JSON.NET.
Doug

5
Chẳng phải một ví dụ ngắn sẽ khiến đây trở thành một câu trả lời thực sự đáng được bình chọn sao?
TaW

1
Câu trả lời này không đầy đủ và do đó gây hiểu lầm. [IgnoreDataMember]sẽ không hoạt động nếu lớp có [Serializable]thuộc tính. Xem chi tiết trong câu trả lời của Doug .
Alex Fainshtein

165

Ngoài ra, DataContractSerializer sẽ tuần tự hóa các mục được đánh dấu là [Serializable] và cũng sẽ tuần tự hóa các loại không được đánh dấu trong .NET 3.5 SP1 trở lên, để cho phép hỗ trợ tuần tự hóa các loại ẩn danh.

Vì vậy, nó phụ thuộc vào cách bạn đã trang trí lớp học của mình như thế nào để giữ cho một thành viên không đăng nối tiếp:

  • Nếu bạn đã sử dụng [DataContract], hãy xóa [DataMember]đối với thuộc tính.
  • Nếu bạn đã sử dụng [Serializable], hãy thêm [NonSerialized]vào trước trường cho thuộc tính.
  • Nếu bạn chưa trang trí lớp của mình, thì bạn nên thêm [IgnoreDataMember]vào tài sản.

1
Ý bạn là gì khi "trang trí lớp học của bạn", xin giải thích?
alamin

Nếu bạn chưa sử dụng bất kỳ thuộc tính nào trên lớp của mình, chẳng hạn như [DataContract] hoặc [Serializable], thì bạn sẽ thêm [ignoreDataMember] vào thuộc tính mà bạn không muốn tuần tự hóa. Xem câu trả lời của Paul hoặc checkoutall.com/Blog/Index/201410240204236271/…
Doug

8
Điều này nhiều thông tin hơn câu trả lời được chấp nhận.
pvgoran

Có cách nào để bỏ qua thành viên đó và tiếp tục tuần tự hóa cấu trúc / lớp dữ liệu không?
ryanwebjackson

Làm thế nào về việc loại trừ một THUỘC TÍNH khi [Có thể nối tiếp] được sử dụng?
Daniel

31

Trong tuần tự hóa XML, bạn có thể sử dụng thuộc tính [XmlIgnore] (System.Xml.Serialization.XmlIgnoreAttribute) để bỏ qua thuộc tính khi tuần tự hóa một lớp.

Điều này có thể hữu ích cho bạn (Hoặc nó có thể hữu ích cho bất kỳ ai tìm thấy câu hỏi này khi cố gắng tìm cách bỏ qua một thuộc tính khi Serializing trong XML, như tôi đã từng làm).


4
Ah phiếu tiêu cực. Tôi chỉ nghĩ rằng tôi sẽ đăng điều đó bởi vì khi tôi tìm kiếm cách bỏ qua một thuộc tính khi tuần tự hóa một lớp, bài đăng này xuất hiện. Và tôi muốn đặt nó ở đây nếu ai đó tìm thấy bài đăng này giống như tôi đã làm.
Kris Adams

[trong meta] Tôi nghĩ rằng họ bình chọn tiêu cực bởi vì bạn nên mở thêm (hơn especific) câu hỏi về XmlSerialization và trả lời nó, vì vậy mọi người sẽ tìm thấy câu hỏi đó phù hợp hơn trong việc tìm kiếm
Spark

8
Câu trả lời này chính xác là những gì tôi đang tìm kiếm
aclave1


0

Những gì bạn đang nói mâu thuẫn với những gì nó nói trong thư viện MSDN tại vị trí này:

http://msdn.microsoft.com/en-us/library/system.runtime.serialization.datacontractserializer.aspx

Tôi không thấy bất kỳ đề cập đến tính năng SP1 mà bạn đề cập.


1
Bạn có thể tìm thấy tài liệu ở đây (đoạn thứ 3, câu thứ 2): msdn.microsoft.com/en-us/library/ms733127.aspx
NotDan

Mặc dù vậy, bạn nói đúng về liên kết bạn đã đăng, tôi không chắc tại sao họ cũng không đề cập đến nó ở đó.
NotDan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.