2009-12-28 3 views

ответ

8

Да, вы можете предоставить свою собственную реализацию сериализатора. По умолчанию WCF будет использовать DataContractSerializer. Чтобы предоставить собственный сериализатор, вы должны написать свой собственный IOperationBehavior, который ищет и удаляет применяемый в настоящее время DataContractSerializerOperationBehavior из коллекции OperationDescription::Behaviors, а затем применяет собственный экземпляр DataContractSerializerOperationBehavior. Затем DataContractSerializerOperationBehavior отвечает за построение реализации XmlObjectSerializer в своих заводских методах CreateSerializer. Для некоторых примеров кода, как это сделать, check out this article by Dan Rigsby.

Оттуда это все о внедрении собственного пользовательского XmlObjectSerializer, который позволит вам сериализовать XML-данные любому желаемому представлению.

+0

Hi Drew, Но мой сериализатор должен быть получен из базового класса или реализовать некоторые интерфейсы. Если да, то каковы они? Сепаратор должен быть своего рода xmlserializer? Я написал сериализатор, который сериализует типы как байты. – mkus

+0

Вы должны наследовать от XmlObjectSerializer и предоставить собственную реализацию для различных методов. –

+0

Это старый вопрос, но я думаю, я должен добавить, что эта статья из msdn предупреждает об изменении OperationDescription из метода IOperationBehavior http://msdn.microsoft.com/en-us/library/system.servicemodel.description.ioperationbehavior. ASPX. – insipid

2

Обычно вы поместите атрибут [DatacontractSerializer] или [XmlSerializer] выше Service Contract, им вполне уверен, вы можете создать свой собственный, следовательно, почему вы применять их в качестве атрибутов, теперь, если только reflector бы начать, так что я мог осмотреть XmlSerializer и выяснить, что делает его тикающим.

msdn настаивает на том, что классы, которые хотят быть сериализовать через XmlSerializer, должны быть украшены [XmlAttribute] или [XmlElement] атрибутов (так как это дало бы больше формы в файл XML понимающе), но это не будет работать, если ваши классы оформлены с [DataMember], который совместим с DataContractSerializer, поэтому вы должны иметь возможность создавать собственный сериализатор, который будет сериализовать что-либо с тегом [DataMember], как XmlSerializer

3

Команда WCF сделала это, когда представила DataContractJsonSerializer.

Есть далеко больше, чем источники информации уже упомянутых здесь, в двух других ответов - например, вы, возможно, придется вводить и изменять операции поведения и операции форматирования используется, добавьте новый кодер, и добавить совершенно новый обслуживания и поведения клиентов. Это зависит от того, что новый формат сериализации и что вы пытаетесь сделать.

Однако, если ваша цель состоит только в том, чтобы добавить новый сериализатор для автономной сериализации, это проще.

Что я хотел бы порекомендовать - посмотрите на все различные использования DataContractJsonSerializer (через Reflector) в System.Runtime.Serialization.dll, System.ServiceModel.Web.dll и System.Runtime.ServiceModel.dll.

Если вас интересует только отдельный аспект сериализации, просто посмотрите на DataContractJsonSerializer и связанные классы в пространстве имен Serialization. Для вас достаточно интуитивно понять различные тонкости реализации пользовательской сериализации. Задайте вопрос, если у вас есть конкретные вопросы, но я действительно считаю, что это самый быстрый и элегантный способ узнать это решение ...

Смежные вопросы