9

DataContractSerializer yêu cầu các lớp và thành viên phải được đánh dấu bằng thuộc tính DataContractDataMember. Tuy nhiên, trong trường hợp của tôi, các lớp được tạo tự động với khung công tác EFPocoAdapater và các thuộc tính này không có mặt.DataContractSerializer: Cách tuần tự hóa các lớp/thành viên mà không có thuộc tính DataContract/DataMember

Làm cách nào để buộc tuần tự hóa tất cả các thành viên sử dụng DataContractSerializer mà không có các thuộc tính này?

Từ Alexdej:

này thay đổi trong 3.5SP1, hy vọng bạn thấy rằng: http://www.pluralsight.com/community/blogs/aaron/archive/2008/05/13/50934.aspx

Trả lời

6

Bạn không thể - đồng bằng và đơn giản. Thuộc tính là cần thiết cho DataContractSerializer để nhận các phần tử để tuần tự hóa. Trong hợp đồng với XmlSerializer, mà về cơ bản chỉ serializes tất cả mọi thứ (trừ khi bạn rõ ràng cho nó bỏ qua nó), DataContractSerializer là "opt-in" - bạn phải nói rõ ràng (bằng các thuộc tính) mà các trường và/hoặc thuộc tính để tuần tự hóa.

Cập nhật: Như nhiều người đã chỉ ra, với .NET 3.5 SP1, Microsoft nới lỏng các quy tắc này một chút - bất kỳ thuộc tính đọc/ghi nào sẽ được tự động hóa bởi DataContractSerializer. Đồng thời, lớp học của bạn cũng cần phải có một constructor parameterless mặc định - âm thanh như các yêu cầu chính xác, chúng tôi đã cho XmlSerializer cách trở lại khi ....

Tất nhiên, đây:

  • không cho phép bạn sắp xếp thứ tự riêng tư - nếu bạn muốn tuần tự hóa, bạn phải hiển thị nó là thuộc tính đọc/ghi công khai
  • không cho phép bạn chỉ định thứ tự được chọn của các tham số - nó sẽ chỉ sử dụng chúng trong thứ tự chúng xuất hiện trong lớp
  • bây giờ yêu cầu bạn phải có một hàm tạo không tham số trong lớp của bạn một lần nữa cho đến r deserialization

Tôi vẫn nghĩ rằng điều này phải rõ ràng và rõ ràng, làm cho những người không còn cần thiết mở ra con đường cho chương trình lười biếng/cẩu thả - Tôi không thích nó. Nhưng nếu bạn muốn, bạn có thể sử dụng nó bây giờ không đánh dấu một cách rõ ràng tài sản của bạn với [DataMember] .....

Marc

+0

Tôi đã thực sự hy vọng bạn sẽ sai nhưng sau nhiều googling tôi sợ bạn nói đúng. Không thể sử dụng XmlSerializer (vấn đề tham chiếu vòng tròn làm việc với Khung thực thể). Ah tốt, các lớp học vô danh nó được. – aleemb

+1

Vâng, tôi đã đọc thêm một chút về điều này ngày hôm nay, và ở đây tôi thấy rằng nếu các lớp của bạn được sử dụng bởi DataContractSerializer được đánh dấu bằng [Serializable], thì theo mặc định chúng sẽ được tuần tự hóa giống như định dạng SOAP cũ - MỌI một trường bất kể khả năng hiển thị được bao gồm. Đó có thể là sự giúp đỡ cho bạn có thể? –

+0

Cũng không thực sự vì vấn đề của tôi thực sự là tôi không thể chạm vào các lớp được tạo tự động và tôi cần có khả năng bỏ qua các trường bên ngoài. Tôi đang sử dụng dự trong các truy vấn LINQ của tôi để có được xung quanh này bây giờ mà hoạt động tốt. – aleemb

0

Tôi tin rằng nó là tốt. Nếu bạn triển khai thực hiện giao diện ISerializable thì trình serializer sẽ thực thi việc thay thế các thuộc tính của bạn. Mặc dù tôi nghĩ bạn vẫn sẽ phải đánh dấu lớp [Serializable].

Công việc nhỏ hơn một chút so với việc thêm thuộc tính nhưng nó hoạt động.

0

Chỉ cần đánh dấu lớp học bằng thuộc tính [Có thể tuần tự]. Bất kỳ thành viên nào bạn không muốn đánh dấu tuần tự với [NonSerialized]. Lưu ý rằng [Serializable] làm cho tất cả các trường được tuần tự theo mặc định, trong đó [DataContract] được tuần tự hóa không có trường theo mặc định trừ những trường được đánh dấu bằng [DataMember].