问题 自定义WCF DataContractSerializer


是否可以使用我自己的序列化程序替换Windows Communication Foundation中的dataContractSerializer。如果有可能,我该如何实现?


2368
2017-12-28 21:49


起源



答案:


是的,您可以提供自己的序列化程序实现。默认情况下,WCF将使用 DataContractSerializer。要提供自己的序列化程序,您必须自己编写 IOperationBehavior 寻找并删除目前适用的 DataContractSerializerOperationBehavior 来自 OperationDescription::Behaviors 集合然后应用一个自定义实例 DataContractSerializerOperationBehavior。然后DataContractSerializerOperationBehavior负责构造 XmlObjectSerializer 在它的实施 CreateSerializer 工厂方法。对于一些代码示例,如何执行此操作, 看看Dan Rigsby的这篇文章

从那里开始,就是实现自己的自定义 XmlObjectSerializer 这将允许您将XML信息集序列化为您想要的任何表示。


9
2017-12-29 14:02



嗨Drew,但我的序列化器必须从基类派生或实现一些接口。如果答案是肯定的,那么这些是什么?序列化程序必须是一种xmlserializer吗?我写了一个序列化器,将类型序列化为字节。 - mkus
您必须从XmlObjectSerializer继承并为各种方法提供自己的实现。 - Drew Marsh
这是一个较旧的问题,但我想我应该补充说msdn的这篇文章警告不要从IOperationBehavior方法修改OperationDescription msdn.microsoft.com/en-us/library/...。 - insipid


答案:


是的,您可以提供自己的序列化程序实现。默认情况下,WCF将使用 DataContractSerializer。要提供自己的序列化程序,您必须自己编写 IOperationBehavior 寻找并删除目前适用的 DataContractSerializerOperationBehavior 来自 OperationDescription::Behaviors 集合然后应用一个自定义实例 DataContractSerializerOperationBehavior。然后DataContractSerializerOperationBehavior负责构造 XmlObjectSerializer 在它的实施 CreateSerializer 工厂方法。对于一些代码示例,如何执行此操作, 看看Dan Rigsby的这篇文章

从那里开始,就是实现自己的自定义 XmlObjectSerializer 这将允许您将XML信息集序列化为您想要的任何表示。


9
2017-12-29 14:02



嗨Drew,但我的序列化器必须从基类派生或实现一些接口。如果答案是肯定的,那么这些是什么?序列化程序必须是一种xmlserializer吗?我写了一个序列化器,将类型序列化为字节。 - mkus
您必须从XmlObjectSerializer继承并为各种方法提供自己的实现。 - Drew Marsh
这是一个较旧的问题,但我想我应该补充说msdn的这篇文章警告不要从IOperationBehavior方法修改OperationDescription msdn.microsoft.com/en-us/library/...。 - insipid


WCF团队在介绍DataContractJsonSerializer时就这样做了。

 比其他两个答案中提到的接触点更多 - 例如,您可能必须引入和更改正在使用的操作行为和操作格式化程序,添加新的编码器,以及添加全新的服务和客户端行为。这取决于新的序列化格式是什么以及您尝试做什么。

但是,如果您的目标是仅为独立序列化添加新的序列化程序,则更简单。

我建议的是 - 在System.Runtime.Serialization.dll,System.ServiceModel.Web.dll和System.Runtime.ServiceModel.dll中查看DataContractJsonSerializer(通过Reflector)的所有不同用法。

如果您只对独立序列化方面感兴趣,只需查看DataContractJsonSerializer以及Serialization命名空间中的关联类。您应该非常直观地掌握自定义序列化实现的各种细微之处。如果您有具体问题,请随时提出,但我确信这是学习这一特定解决方案的最快捷,最优雅的方式......


3
2018-02-08 22:38





通常你放置属性 [DatacontractSerializer] 要么 [XmlSerializer] 在服务合同之上,我很确定你可以创建自己的,因此为什么你将它们作为属性应用,现在如果只是 反射器 会启动,以便我可以检查XmlSerializer,并找出是什么让它打勾。

MSDN 坚持要通过XmlSerializer序列化的类必须用。来装饰 [XmlAttribute] 要么 [XmlElement] 属性(因为它可以理解地为xml文件提供更多的形状),但是如果你的类用它来装饰,它确实有效 [DataMember],与DataContractSerializer兼容,因此您应该能够创建自己的序列化程序,使用[DataMember]标记序列化任何内容,就像XmlSerializer一样


2
2017-12-29 10:10