Пользовательский WCF DataContractSerializer

Можно ли заменить dataContractSerializer в Windows Communication Foundation моим собственным сериализатором. Если это возможно, как я могу это достичь?

Ответ 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