Пользовательский WCF DataContractSerializer для обработки данных
-
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