Khi nào nên sử dụng thuộc tính DataContract và DataMember?


179

Tôi rất bối rối về DataContractthuộc tính trong WCF. Theo hiểu biết của tôi, nó được sử dụng để tuần tự loại người dùng xác định như các lớp. Tôi đã viết một lớp được tiếp xúc ở phía khách hàng như thế này.

[DataContract]
public class Contact
{
    [DataMember]
    public int Roll { get; set; }

    [DataMember]
    public string Name { get; set; }

    [DataMember]
    public string Address { get; set; }

    [DataMember]
    public int Age { get; set; }
}

Nó hoạt động đúng nhưng khi tôi gỡ bỏ DataContractDataMembernó cũng hoạt động đúng. Tôi không thể hiểu tại sao nó hoạt động đúng. Có ai có thể cho tôi biết thực tế sử dụng là DataContractgì không?

Hợp đồng dịch vụ của tôi trông như thế này

[ServiceContract]    
public interface IRestServiceImpl
{
    [OperationContract]        
    Contact XmlData(string id);      
}

Một câu trả lời hoàn hảo có ở đây stackoverflow.com/questions/5681842/ trên
Asif Iqbal

Câu trả lời:


361

Do rất nhiều lập trình viên bị choáng ngợp với các thuộc tính [DataContract][DataMember]thuộc tính, với .NET 3.5 SP1, Microsoft đã tạo ra trình tuần tự hóa hợp đồng dữ liệu xử lý tất cả các lớp - ngay cả khi không có bất kỳ thuộc tính nào - giống như trình tuần tự XML cũ.

Vì vậy, kể từ .NET 3.5 SP1, bạn không phải thêm hợp đồng dữ liệu hoặc thuộc tính thành viên dữ liệu nữa - nếu bạn không thì trình tuần tự hợp đồng dữ liệu sẽ tuần tự hóa tất cả các thuộc tính công khai trên lớp của bạn, giống như trình tuần tự hóa XML.

TUY NHIÊN: bằng cách không thêm các thuộc tính đó, bạn sẽ mất rất nhiều khả năng hữu ích:

  • không có [DataContract], bạn không thể xác định một không gian tên XML để dữ liệu của bạn tồn tại
  • không có [DataMember], bạn không thể tuần tự hóa các thuộc tính hoặc trường không công khai
  • không có [DataMember], bạn không thể xác định thứ tự tuần tự hóa ( Order=) và DCS sẽ tuần tự hóa tất cả các thuộc tính theo thứ tự bảng chữ cái
  • không có [DataMember], bạn không thể xác định tên khác cho thuộc tính của mình ( Name=)
  • không có [DataMember], bạn không thể định nghĩa những thứ như IsRequired=hoặc các thuộc tính hữu ích khác
  • không có [DataMember], bạn không thể bỏ qua một số thuộc tính công cộng nhất định - tất cả các thuộc tính công cộng sẽ được DCS nối tiếp

Vì vậy, đối với giải pháp "quick'n'denty", bỏ đi các thuộc tính [DataContract][DataMember]thuộc tính sẽ hoạt động - nhưng vẫn nên có chúng trên các lớp dữ liệu của bạn - chỉ cần nói rõ hơn về những gì bạn đang làm và tự cung cấp cho mình truy cập vào tất cả các tính năng bổ sung mà bạn không có mà không có chúng ...


bạn có nghĩa là theo mặc định tất cả các loại dữ liệu được đánh dấu bên trong là tuần tự hóa và chúng tôi đã sử dụng DataContract / DataMember để hạn chế chúng.
santosh singh

2
@Santosh: nếu bạn có một lớp với một số thuộc tính công khai, chúng sẽ được tuần tự hóa bởi Bộ tuần tự hợp đồng dữ liệu WCF, trừ khi bạn áp dụng rõ ràng [DataContract] / [DataMember]. những gì không
marc_s

36
@Arthis: điều đó không hoàn toàn đúng. Tính đến NET 3.5 SP1, WCF sẽ hạnh phúc lớp serialize mà không cần bất kỳ [DataContract][DataMember]thuộc tính ... nhưng ngay sau khi bạn bắt đầu sử dụng một trong những thuộc tính, sau đó hành vi này "mặc định" sẽ ngừng làm việc - ngay sau khi bạn có một single [DataMember] trong của bạn lớp, kể từ thời điểm đó, chỉ những thuộc tính có thuộc tính này sẽ được tuần tự hóa.
marc_s

4
Ôi! Thx đã làm rõ quan điểm đó! Tôi sẽ đào nó thêm một chút sau đó!
Arthis

6
Youhou! nó đá !! Merci beaucoup!
Arthis

16

Về mặt WCF, chúng tôi có thể giao tiếp với máy chủ và máy khách thông qua tin nhắn. Để truyền tin nhắn và từ một khách hàng tiềm năng bảo mật, chúng ta cần tạo một dữ liệu / tin nhắn theo định dạng nối tiếp.

Để tuần tự hóa dữ liệu, chúng tôi sử dụng các thuộc tính [datacontract] và [datamember]. Trong trường hợp của bạn, nếu bạn đang sử dụng datacontractWCF, sử dụng DataContractSerializerWCF khác XmlSerializer, đó là kỹ thuật tuần tự hóa mặc định.

Hãy để tôi giải thích chi tiết:

về cơ bản WCF hỗ trợ 3 loại serialization:

  1. XmlSerializer
  2. DataContractSerializer
  3. NetDataContractSerializer

XmlSerializer : - Thứ tự mặc định giống như lớp

DataContractSerializer / NetDataContractSerializer : - Thứ tự mặc định là theo thứ tự chữ cái

XmlSerializer : - Lược đồ XML mở rộng

DataContractSerializer / NetDataContractSerializer : - Lược đồ XML bị ràng buộc

XmlSerializer : - Không thể hỗ trợ phiên bản

DataContractSerializer / NetDataContractSerializer : - Có thể hỗ trợ phiên bản

XmlSerializer : - Khả năng tương thích với ASMX

DataContractSerializer / NetDataContractSerializer : - Khả năng tương thích với .NET Remote

XmlSerializer : - Không yêu cầu thuộc tính trong XmlSerializer

DataContractSerializer / NetDataContractSerializer : - Thuộc tính bắt buộc trong tuần tự hóa này

vì vậy những gì bạn sử dụng phụ thuộc vào yêu cầu của bạn ...


8

Hợp đồng dữ liệu là một thỏa thuận chính thức giữa một dịch vụ và khách hàng mô tả trừu tượng dữ liệu sẽ được trao đổi. Nghĩa là, để giao tiếp, khách hàng và dịch vụ không phải chia sẻ cùng loại, chỉ có cùng hợp đồng dữ liệu. Hợp đồng dữ liệu xác định chính xác, đối với từng tham số hoặc kiểu trả về, dữ liệu nào được tuần tự hóa (biến thành XML) sẽ được trao đổi.

Windows Communication Foundation (WCF) sử dụng một công cụ tuần tự hóa được gọi là Trình tuần tự hợp đồng dữ liệu theo mặc định để tuần tự hóa và giải tuần tự hóa dữ liệu (chuyển đổi nó thành và từ XML). Tất cả các loại nguyên thủy .NET Framework, chẳng hạn như số nguyên và chuỗi, cũng như các loại nhất định được coi là nguyên thủy, như DateTime và XmlEuity, có thể được tuần tự hóa mà không cần chuẩn bị nào khác và được coi là có hợp đồng dữ liệu mặc định. Nhiều loại .NET Framework cũng có hợp đồng dữ liệu hiện có.

Bạn có thể tìm thấy bài viết đầy đủ ở đây.


2
Điều đó hoàn toàn đúng và tốt, nhưng nó không thực sự trả lời câu hỏi của OP về lý do tại sao trình tuần tự hợp đồng dữ liệu cũng hoạt động mà không có bất kỳ thuộc tính [DataContract] và [DataMember] nào trên các lớp của bạn ....
marc_s

Có ai có thể cho tôi biết việc sử dụng DataContract thực tế là gì không? - Tôi nghĩ ít nhất một phần của câu hỏi đã được trả lời.
Tôi chấp nhận

2

Hợp đồng dữ liệu là một thỏa thuận chính thức giữa một dịch vụ và khách hàng mô tả trừu tượng dữ liệu sẽ được trao đổi.

Hợp đồng dữ liệu có thể rõ ràng hoặc ẩn. Kiểu đơn giản như int, chuỗi vv có hợp đồng dữ liệu ngầm. Đối tượng do người dùng xác định là loại rõ ràng hoặc Loại phức tạp mà bạn phải xác định hợp đồng Dữ liệu bằng cách sử dụng thuộc tính [DataContract] và [DataMember].

Hợp đồng dữ liệu có thể được định nghĩa như sau:

  • Nó mô tả định dạng bên ngoài của dữ liệu được truyền đến và từ các hoạt động dịch vụ

  • Nó xác định cấu trúc và các loại dữ liệu được trao đổi trong các thông điệp dịch vụ

  • Nó ánh xạ loại CLR sang Lược đồ XML
  • Nó định nghĩa cách các kiểu dữ liệu được tuần tự hóa và giải tuần tự hóa. Thông qua tuần tự hóa, bạn chuyển đổi một đối tượng thành một chuỗi các byte có thể được truyền qua mạng. Thông qua quá trình khử lưu huỳnh, bạn tập hợp lại một đối tượng từ một chuỗi byte mà bạn nhận được từ một ứng dụng gọi điện.
  • Đây là một hệ thống phiên bản cho phép bạn quản lý các thay đổi đối với dữ liệu có cấu trúc

Chúng ta cần bao gồm tham chiếu System.R.78.Serialization cho dự án. Tập hợp này chứa thuộc tính DataContract và DataMember.


2
  1. Hợp đồng dữ liệu: Nó xác định rằng lớp thực thể của bạn đã sẵn sàng cho quá trình Tuần tự hóa.

  2. Thành viên dữ liệu: Nó xác định rằng trường cụ thể là một phần của hợp đồng dữ liệu và nó có thể được tuần tự hóa.


0

Ngoài ra khi bạn gọi từ http yêu cầu, nó sẽ hoạt động bình thường nhưng khi bạn cố gắng gọi từ net.tcp thì lúc đó bạn nhận được tất cả những thứ này


0

Thuộc tính DataMember không bắt buộc phải thêm để tuần tự hóa dữ liệu. Khi thuộc tính DataMember không được thêm vào, XMLSerializer cũ sẽ tuần tự hóa dữ liệu. Thêm một DataMember cung cấp các thuộc tính hữu ích như thứ tự, tên, được yêu cầu mà không thể được sử dụng theo cách khác.

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.