Можно ли заменить dataContractSerializer в Windows Communication Foundation моим собственным сериализатором. Если это возможно, как я могу это достичь?
Пользовательский WCF DataContractSerializer
Ответ 1
Да, вы можете предоставить свою собственную реализацию сериализатора. По умолчанию WCF будет использовать DataContractSerializer
. Чтобы предоставить свой собственный сериализатор, вы должны написать свой собственный IOperationBehavior
, который ищет и удаляет применяемый в настоящее время DataContractSerializerOperationBehavior
из OperationDescription::Behaviors
, а затем применяет собственный экземпляр DataContractSerializerOperationBehavior
. Затем DataContractSerializerOperationBehavior отвечает за построение XmlObjectSerializer
в нем CreateSerializer
factory. Для некоторых примеров кода, как это сделать, просмотрите эту статью Дэном Ригсби.
Оттуда это все о внедрении собственного пользовательского XmlObjectSerializer
, который позволит вам сериализовать XML-данные для любого желаемого представления.
Ответ 2
Команда WCF сделала это, когда представила DataContractJsonSerializer.
Есть гораздо больше сенсорных точек, чем те, которые упомянуты здесь в двух других ответах - например, вам может потребоваться ввести и изменить поведение операций и используемых форматировщиков операций, добавить новый кодер и добавить совершенно новый сервис и клиент поведение. Это зависит от того, что новый формат сериализации и что вы пытаетесь сделать.
Однако, если ваша цель состоит только в добавлении нового сериализатора для автономной сериализации, это проще.
То, что я бы рекомендовал, - посмотреть на все различные использования DataContractJsonSerializer (через Reflector) в System.Runtime.Serialization.dll, System.ServiceModel.Web.dll и System.Runtime.ServiceModel.dll.
Если вас интересует только отдельный аспект сериализации, просто посмотрите на DataContractJsonSerializer и связанные классы в пространстве имен Serialization. Для вас достаточно интуитивно понять различные тонкости реализации пользовательской сериализации. Спросите, есть ли у вас конкретные вопросы, но я искренне верю, что это самый быстрый и элегантный способ узнать это конкретное решение...
Ответ 3
Обычно вы помещаете атрибут [DatacontractSerializer]
или [XmlSerializer]
над Договором на обслуживание, я уверен, что вы могли бы создать свой собственный, поэтому вы применяете их как атрибуты, теперь, если бы только reflector запустится так что я могу проверить XmlSerializer и узнать, что делает его тикающим.
msdn утверждают, что классы, которые должны быть сериализованы через XmlSerializer, должны быть украшены атрибутами [XmlAttribute]
или [XmlElement]
(так как это придало бы более подробный вид XML файлу), но он работает, если ваши классы украшены [DataMember]
, который совместим с DataContractSerializer, поэтому вы должны иметь возможность создавать свой собственный сериализатор, который будет сериализовать что-либо с тегом [DataMember], как и XmlSerializer