zoukankan      html  css  js  c++  java
  • WCF 第六章 编码与序列化 使用NetDataContractSerializer共享类型

    WCF 中的默认序列化方法是DataContractSerializer.  这是WCF开发组想要大部分开发人员使用的序列化方法因为它强制进行契约共享而非类型共享。这是创建面向服务架构的一个原则。然而,如果你的想法是支持类型一致并在客户端和服务端间共享类型信息那么这个方法并不会为你的设计引入问题,你可以使用NetDataContractSerializer来序列化。就像在之前的”比较WCF序列化选项”章节描述的那样,NetDataContractSerializer与DataContractSerializer本质是类似的,但是额外支持了类型信息共享和引用保留。

      尽管WCF支持NetDataContractSerializer,在你的数据契约中没有任何属性来支持使用这个序列化方法。这是为了防止类型共享很轻易的扩散的目的而完成的。为了使用NetDataContractSerializer,你必须使用一个自定义行为(列表6.18)并标识你的操作契约(列表6.19)。

    列表6.18 使用NetDataContractFormatAttribute

     public class NetDataContractFormatAttribute : Attribute, IOperationBehavior
        {
            public void AddBindingParameters(OperationDescription operationDescription, System.ServiceModel.Channels.BindingParameterCollection bindingParameters)
            {
            }
    
            public void ApplyClientBehavior(OperationDescription operationDescription, System.ServiceModel.Dispatcher.ClientOperation clientOperation)
            {
                ReplaceDataContractSerializerOperationBehavior(operationDescription);
            }
    
            public void ApplyDispatchBehavior(OperationDescription operationDescription, System.ServiceModel.Dispatcher.DispatchOperation dispatchOperation)
            {
                ReplaceDataContractSerializerOperationBehavior(operationDescription);
            }
    
            public void Validate(OperationDescription operationDescription)
            {
            }
    
            private static void ReplaceDataContractSerializerOperationBehavior(OperationDescription description)
            {
                DataContractSerializerOperationBehavior dcs = description.Behaviors.Find<DataContractSerializerOperationBehavior>();
                if (dcs != null)
                {
                    description.Behaviors.Remove(dcs);
                }
                description.Behaviors.Add(new NetDataContractSerializerOperationBehavior(description));
            }
        }
    
        public class NetDataContractSerializerOperationBehavior : DataContractSerializerOperationBehavior
        {
            private static NetDataContractSerializer serializer = new NetDataContractSerializer();
    
            public NetDataContractSerializerOperationBehavior(OperationDescription description) :
                base(description)
            {
            }
    
            public override XmlObjectSerializer CreateSerializer(Type type,
                string name, string ns, IList<Type> knownTypes)
            {
                return NetDataContractSerializerOperationBehavior.serializer;
            }
    
            public override XmlObjectSerializer CreateSerializer(Type type,
                System.Xml.XmlDictionaryString name, System.Xml.XmlDictionaryString ns, IList<Type> knownTypes)
            {
                return NetDataContractSerializerOperationBehavior.serializer;
            }
        }
    

      为了使用NetDataContractSerializer,需要像列表6.19中显示的那样,在一个操作上使用[NetDataContractFormat]属性。

    列表6.19 使用NetDataContract 序列化

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.ServiceModel;
    
    namespace EssentialWCF
    {
        [ServiceContract]
        public interface IEmployeeInformation
        {
            [OperationContract]
            [NetDataContractFormat]
            List<Employee> GetEmployees();
        }
    }
    
    

      在一个操作契约上应用这个属性将指导WCF使用NetDataContractSerializer。如果我们在网络上查看数据,我们可以看到被发送的XML包含类型信息和额外的关于引用的信息,就像列表6.20中显示的。

    列表6.20 使用NetDataContract 序列化的输出结果


    作者:DanielWise
    出处:http://www.cnblogs.com/danielWise/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    Echarts使用笔记
    vue导出pdf
    mvn上传pom/jar至Nexus私服
    Linux下安装Redis
    国内首发,这款 Serverless 云原生一体化部署工具正式开源!
    使用云托管快速部署CMS内容管理系统
    云开发走进高校,腾讯云联合新工科联盟探索新生工程教育模式
    从0到3000万,TA们用云开发这样做
    基于 ThinkJS 的云开发体验
    使用小程序·云开发静态托管实现免鉴权h5跳转小程序
  • 原文地址:https://www.cnblogs.com/danielWise/p/1911652.html
Copyright © 2011-2022 走看看