2009-12-28 25 views
10

Có thể thay thế dataContractSerializer trong Windows Communication Foundation bằng bộ nối tiếp của riêng tôi không. Nếu có thể, làm thế nào tôi có thể đạt được điều này?Tùy chỉnh WCF DataContractSerializer

Trả lời

8

Có, bạn có thể cung cấp việc triển khai bộ nối tiếp của riêng mình. Theo mặc định WCF sẽ sử dụng DataContractSerializer. Để cung cấp bộ nối tiếp của riêng bạn, bạn phải tự viết IOperationBehavior của riêng mình để tìm và loại bỏ số DataContractSerializerOperationBehavior hiện tại từ bộ sưu tập OperationDescription::Behaviors và sau đó áp dụng một trường hợp tùy chỉnh của DataContractSerializerOperationBehavior. DataContractSerializerOperationBehavior sau đó chịu trách nhiệm xây dựng triển khai thực hiện XmlObjectSerializer trong các phương thức nhà máy của nó là CreateSerializer. Đối với một số mẫu mã về cách thực hiện việc này, check out this article by Dan Rigsby.

Từ đó, đó là tất cả về việc triển khai tùy chỉnh XmlObjectSerializer tùy chỉnh của riêng bạn, cho phép bạn tuần tự hóa XML infoset với bất kỳ đại diện nào bạn muốn.

+0

Hi Drew, Nhưng serializer của tôi phải được bắt nguồn từ một lớp cơ sở hoặc thực hiện một số giao diện. Nếu câu trả lời là có, đây là những gì? Trình serializer có phải là một loại xmlserializer không? Tôi đã viết một serializer mà serializes các loại như byte. – mkus

+0

Bạn phải kế thừa từ XmlObjectSerializer và cung cấp một thực hiện của riêng bạn cho các phương pháp khác nhau. –

+0

Đây là một câu hỏi cũ nhưng tôi nghĩ rằng tôi nên thêm rằng bài viết này từ msdn cảnh báo chống lại việc sửa đổi các OperationDescription từ một phương pháp IOperationBehavior http://msdn.microsoft.com/en-us/library/system.servicemodel.description.ioperationbehavior. aspx. – insipid

2

Thông thường bạn đặt thuộc tính [DatacontractSerializer] hoặc [XmlSerializer] trên Hợp đồng dịch vụ, im khá chắc chắn bạn có thể tạo riêng của bạn do vậy tại sao bạn áp dụng chúng như là thuộc tính, bây giờ nếu chỉ reflector sẽ bắt đầu để tôi có thể kiểm tra việc XmlSerializer và tìm hiểu những gì làm cho nó đánh dấu.

msdn nhấn mạnh rằng các lớp học mà muốn được tuần tự qua XmlSerializer, phải được trang trí với [XmlAttribute] hoặc [XmlElement] thuộc tính (vì nó sẽ cung cấp cho hình dạng hơn để các tập tin xml understandingly), nhưng nó không có tác dụng nếu lớp học của bạn được trang trí bằng các [DataMember], tương thích với DataContractSerializer, do đó bạn có thể tạo bộ nối tiếp của riêng bạn sẽ sắp xếp bất kỳ thứ gì bằng thẻ [DataMember], giống như XmlSerializer

3

Đội WCF đã làm điều này khi họ giới thiệu DataContractJsonSerializer.

xa hơn điểm tiếp xúc khác so với các điểm được đề cập ở đây trong hai câu trả lời khác - ví dụ: bạn có thể phải giới thiệu và thay đổi hành vi hoạt động và định dạng hoạt động đang được sử dụng, thêm bộ mã hóa mới và thêm hoàn toàn mới dịch vụ và hành vi của khách hàng là tốt. Nó phụ thuộc vào định dạng serialization mới là gì và những gì bạn đang cố gắng làm.

Tuy nhiên, nếu mục tiêu của bạn là chỉ thêm bộ nối tiếp mới để tuần tự hóa độc lập, nó đơn giản hơn.

Những gì tôi muốn giới thiệu là - xem xét tất cả các cách sử dụng khác nhau của DataContractJsonSerializer (thông qua Reflector) trong System.Runtime.Serialization.dll, System.ServiceModel.Web.dll và System.Runtime.ServiceModel.dll.

Nếu bạn quan tâm đến khía cạnh serialization độc lập, chỉ cần nhìn vào DataContractJsonSerializer và các lớp liên quan trong không gian tên Serialization. Nó nên khá trực quan để bạn nắm bắt được sự tinh tế khác nhau của việc triển khai tuần tự hóa tùy chỉnh. Hãy hỏi nếu bạn có câu hỏi cụ thể, nhưng tôi thực sự tin rằng đây là cách nhanh nhất và thanh lịch nhất để tìm hiểu giải pháp cụ thể này ...

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