2011-01-29 69 views
141

Tôi rất bối rối về thuộc tính DataContract trong WCF. Theo kiến ​​thức của tôi nó được sử dụng cho serializating người dùng định nghĩa loại như các lớp học. Tôi đã viết một lớp học được tiếp xúc ở phía khách hàng như thế này.Khi nào sử dụng các thuộc tính DataContract và DataMember?

[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 tốt nhưng khi tôi loại bỏ DataContractDataMember nó cũng làm việc đúng cách. Tôi không thể hiểu tại sao nó hoạt động đúng cách. Bất kỳ ai có thể cho tôi biết việc sử dụng thực tế của DataContract là gì?

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);  
} 
+0

Câu trả lời hoàn hảo ở đây http://stackoverflow.com/questions/5681842/datacontracts-and-datamembers –

Trả lời

288

Kể từ rất nhiều lập trình viên đã choáng ngợp với [DataContract][DataMember] thuộc tính, với .NET 3.5 SP1, Microsoft đã thực hiện các serializer hợp đồng dữ liệu xử lý tất cả các lớp - thậm chí không có bất kỳ của các thuộc tính đó - giống như bộ nối tiếp XML cũ. Vì vậy, đối với .NET 3.5 SP1, bạn không cần phải thêm 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 làm bộ nối tiếp 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 serializer XML sẽ.

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

  • mà không [DataContract], bạn không thể xác định một không gian tên XML cho dữ liệu của bạn sống trong
  • mà không [DataMember], bạn không thể tuần tự hóa các thuộc tính hoặc trường công khai
  • mà không cần [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ự abc
  • mà không [DataMember], bạn không thể định nghĩa một tên khác cho tài sản của bạn (Name=)
  • mà không [DataMember], bạn không thể xác định những thứ như IsRequired= hoặc các thuộc tính hữu ích khác
  • mà không [DataMember], bạn không thể bỏ qua tài sản công cộng nào đó - tất cả các công thuộc tính sẽ được tuần tự bởi DCS

vì vậy, đối với một "quick'n'dirty" giải pháp, để lại đi [DataContract][DataMember] thuộc tính sẽ làm việc - nhưng nó vẫn còn là một ý tưởng tốt để có chúng trên da của bạn các lớp học của chúng tôi - chỉ để rõ ràng hơn về những gì bạn đang làm và để cho bạn truy cập vào tất cả các tính năng bổ sung mà bạn không nhận được mà không có chúng ...

+0

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

+2

@ Santosh: nếu bạn có một lớp học với một số tài sản công cộng, chúng sẽ được tuần tự hóa bởi WCF Data Contract Serializer, trừ khi bạn áp dụng một cách rõ ràng [DataContract]/[DataMember] .- thì 100% bạn có thể nói những gì được tuần tự hóa và những gì không –

+0

Cảm ơn bạn đã làm rõ. –

6

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

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

Bạn có thể tìm thấy toàn bộ bài viết here.

+1

Đó là tất cả sự thật và tốt, nhưng nó không thực sự trả lời câu hỏi của OP là tại sao bộ nối tiếp 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 lớp của bạn. .. –

+0

* Bất kỳ ai có thể cho tôi biết việc sử dụng DataContract thực sự là gì? * - Tôi nghĩ rằng ít nhất một phần của câu hỏi ** được trả lời. – IAbstract

0

Ngoài ra khi bạn gọi từ http yêu cầu nó sẽ hoạt động đúng nhưng khi thử của bạn để gọi từ net.tcp thời gian đó bạn sẽ có được tất cả điều này loại thứ

10

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

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

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

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

  1. XmlSerializer
  2. DataContractSerializer
  3. NetDataContractSerializer

XmlSerializer: - Mặc định trật tự là Tương tự như lớp

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

XmlSerializer: - XML ​​Schema là mở rộng

DataContractSerializer/NetDataContractSerializer: - XML ​​Schema được Constrained

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

DataContractSerializer/NetDataContractSerializer: - Versioning hỗ trợ có thể

XmlSerializer: - Tương thích với ASMX

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

XmlSerializer : - Thuộc tính không bắt buộc trong XmlSerializer

DataContractSerializer/NetDataContractSerializer: - Thuộc tính cần thiết trong này serializing

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

0

Thuộc tính DataMember không bắt buộc phải thêm vào dữ liệu tuần tự hóa. 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 nếu không.

0

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

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

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

  • Nó mô tả các định dạng bên ngoài của dữ liệu được truyền đến và đi 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 trao đổi trong các tin nhắn dịch vụ

  • Nó ánh xạ loại CLR vào một Lược đồ XML
  • Nó xác định cách các loại dữ liệu được tuần tự hóa và deserialized. Thông qua serialization, 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 deserialization, bạn reassemble một đối tượng từ một chuỗi các byte mà bạn nhận được từ một ứng dụng gọi điện thoại.
  • Nó là một hệ thống phiên bản cho phép bạn quản lý thay đổi dữ liệu có cấu trúc

Chúng ta cần phải bao gồm tài liệu tham khảo System.Runtime.Serialization cho dự án. Hội đồng này chứa thuộc tính DataContract và DataMember.