2013-11-14 17 views
20

Vì vậy, tôi đã trải qua cơ sở mã của chúng tôi và tôi đã thấy một số DTO của chúng tôi có kết hợp và khớp với thuộc tính [DataMember][IgnoreDataMember].Không có thuộc tính [DataMember] so với thuộc tính [IgnoreDataMember]

Trước đây, chúng tôi đã được thông báo rằng nếu chúng tôi không muốn thứ gì đó trong DTO được tuần tự hóa, chỉ cần không thêm thuộc tính [DataMember]. Sau đó, tôi nhìn thấy các thuộc tính khác và đã làm một số đào và có vẻ như điều này rõ ràng nói rằng tài sản sẽ không được đăng.

Bây giờ câu hỏi của tôi là tốt hơn? Thêm [IgnoreDataMember] hoặc không thêm bất kỳ thứ gì.

Tôi đã hỏi xung quanh và có vẻ như là [IgnoreDataMember] là từ những ngày mà mọi thứ đã được đăng và bạn phải ra lệnh cho những gì cần bỏ qua (tôi tin vào .Net 2). Sau đó, họ đã thay đổi nó ngược lại và bạn phải nêu rõ những gì NÊN được sắp xếp theo thứ tự. Bây giờ có vẻ như bạn có thể làm cả hai.

Trả lời

37

Tôi đã hỏi xung quanh và có vẻ như [IgnoreDataMember] là từ những ngày mà mọi thứ đã được đăng và bạn phải đọc những gì cần bỏ qua (tôi tin vào .Net 2). Sau đó, họ đã thay đổi nó ngược lại và bạn phải nêu rõ những gì NÊN được sắp xếp theo thứ tự.

Thực ra điều đó không đúng; IIRC nó luôn luôn là cả hai:

  • nếu nó được đánh dấu là [DataContract] thì chỉ có các thành viên đánh dấu [DataMember] được coi
  • nếu nó là không đánh dấu là [DataContract], sau đó nó mặc định là tất cả mọi thứ, nhưng bạn có thể trừ thành viên sử dụng [IgnoreDataMember]

tôi thường chỉ bỏ qua [DataMember] điều mà tôi không muốn đăng, nhưng bằng nhiều cách [IgnoreDataMember] rõ ràng hơn - chủ yếu vì lợi ích của người bảo trì. Nó nói "Tôi cố ý không serializing này", thay vì "có lẽ tôi biết rằng điều này không được serialized, nhưng có lẽ tôi chỉ quên thêm thuộc tính".

Hoặc sẽ hoạt động.

+3

cũng, theo MS: "Thuộc tính IgnoreDataMemberAttribute chỉ được vinh danh khi được sử dụng với các loại không được đánh dấu."; nếu bạn sử dụng '[DataContract]' và '[IgnoreDataMember]' trên cùng một lớp, cái sau bị bỏ qua. –

+2

@MichaelEdenfield là phần tử thông thường, 'DataContractSerializer' mặc định là * tất cả các trường và thuộc tính công khai * (trường công khai rất hiếm); và thậm chí đó là một chút mơ hồ. Ví dụ, nếu chúng ta đang nói về 'NetDataContractSerializer', nó mặc định là * tất cả các trường * (public và private), nhưng không có thuộc tính nào –

+1

Tôi biết đó là một chủ đề cũ, nhưng tôi gặp phải một vấn đề ngày hôm qua. nói là không chính xác như vậy. Tôi có một lớp học với một trường và 4 thuộc tính. Tất cả 4 thuộc tính chuyển đổi một số dạng dữ liệu (mảng byte, chuỗi hoặc các chuỗi khác) và ghi nó vào một trường. Tôi đã đánh dấu lớp với thuộc tính DataContract và chỉ đánh dấu trường là một DataMember. Tuy nhiên, theo cách này deserializer đã không bỏ qua các thuộc tính, nhưng đặt chúng thành giá trị mặc định (sẽ ghi đè lên trường) .Thêm [IgnoreDataMember] vào các thuộc tính đã khắc phục vấn đề. Vì vậy, nó không bị bỏ qua –

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