【问题标题】:Custom WCF DataContractSerializer自定义 WCF DataContractSerializer
【发布时间】:2010-12-30 14:44:57
【问题描述】:

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

【问题讨论】:

    标签: .net wcf serialization


    【解决方案1】:

    是的,您可以提供自己的序列化程序实现。默认情况下,WCF 将使用DataContractSerializer。要提供自己的序列化程序,您必须编写自己的IOperationBehavior,它会从OperationDescription::Behaviors 集合中寻找并删除当前应用的DataContractSerializerOperationBehavior,然后应用DataContractSerializerOperationBehavior 的自定义实例。然后 DataContractSerializerOperationBehavior 负责在其 CreateSerializer 工厂方法中构造一个 XmlObjectSerializer 实现。有关如何执行此操作的一些代码示例,check out this article by Dan Rigsby

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

    【讨论】:

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

    WCF 团队在引入 DataContractJsonSerializer 时就这样做了。

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

    但是,如果您的目标是只为独立序列化添加一个新的序列化程序,那就更简单了。

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

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

    【讨论】:

      【解决方案3】:

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

      msdn 坚持希望通过 XmlSerializer 序列化的类必须使用 [XmlAttribute][XmlElement] 属性进行装饰(因为它可以理解地赋予 xml 文件更多的形状),但如果你的类用[DataMember] 装饰,它与DataContractSerializer 兼容,因此您应该能够创建自己的序列化程序,该序列化程序将使用[DataMember] 标记序列化任何内容,就像XmlSerializer 一样

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-03-30
        • 2011-03-10
        • 1970-01-01
        • 1970-01-01
        • 2020-11-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多