Пользовательский WCF DataContractSerializer для обработки данных

StackOverflow https://stackoverflow.com/questions/1971743

  •  21-09-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

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

С этого момента все зависит от реализации вашего собственного пользовательского XmlObjectSerializer это позволит вам сериализовать информационный набор XML в любое представление, которое вы хотите.

Другие советы

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top