博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WCF 第六章 编码与序列化 使用NetDataContractSerializer共享类型
阅读量:6981 次
发布时间:2019-06-27

本文共 3147 字,大约阅读时间需要 10 分钟。

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

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

列表6.18 使用NetDataContractFormatAttribute

01 public class NetDataContractFormatAttribute : Attribute, IOperationBehavior
02    {
03        public void AddBindingParameters(OperationDescription operationDescription, System.ServiceModel.Channels.BindingParameterCollection bindingParameters)
04        {
05        }
06  
07        public void ApplyClientBehavior(OperationDescription operationDescription, System.ServiceModel.Dispatcher.ClientOperation clientOperation)
08        {
09            ReplaceDataContractSerializerOperationBehavior(operationDescription);
10        }
11  
12        public void ApplyDispatchBehavior(OperationDescription operationDescription, System.ServiceModel.Dispatcher.DispatchOperation dispatchOperation)
13        {
14            ReplaceDataContractSerializerOperationBehavior(operationDescription);
15        }
16  
17        public void Validate(OperationDescription operationDescription)
18        {
19        }
20  
21        private static void ReplaceDataContractSerializerOperationBehavior(OperationDescription description)
22        {
23            DataContractSerializerOperationBehavior dcs = description.Behaviors.Find<DataContractSerializerOperationBehavior>();
24            if (dcs != null)
25            {
26                description.Behaviors.Remove(dcs);
27            }
28            description.Behaviors.Add(new NetDataContractSerializerOperationBehavior(description));
29        }
30    }
31  
32    public class NetDataContractSerializerOperationBehavior : DataContractSerializerOperationBehavior
33    {
34        private static NetDataContractSerializer serializer = new NetDataContractSerializer();
35  
36        public NetDataContractSerializerOperationBehavior(OperationDescription description) :
37            base(description)
38        {
39        }
40  
41        public override XmlObjectSerializer CreateSerializer(Type type,
42            string name, string ns, IList<Type> knownTypes)
43        {
44            return NetDataContractSerializerOperationBehavior.serializer;
45        }
46  
47        public override XmlObjectSerializer CreateSerializer(Type type,
48            System.Xml.XmlDictionaryString name, System.Xml.XmlDictionaryString ns, IList<Type> knownTypes)
49        {
50            return NetDataContractSerializerOperationBehavior.serializer;
51        }
52    }

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

列表6.19 使用NetDataContract 序列化

01 using System;
02 using System.Collections.Generic;
03 using System.Linq;
04 using System.Text;
05 using System.ServiceModel;
06  
07 namespace EssentialWCF
08 {
09     [ServiceContract]
10     public interface IEmployeeInformation
11     {
12         [OperationContract]
13         [NetDataContractFormat]
14         List<Employee> GetEmployees();
15     }
16 }

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

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

=======
转载自
作者:DanielWise
出处:http://www.cnblogs.com/danielWise/
 

转载于:https://www.cnblogs.com/llbofchina/archive/2011/06/30/2094156.html

你可能感兴趣的文章
你一定不知道IDE里的Tomcat是怎么工作的
查看>>
Typescript 2+迷你书 :从入门到不放弃
查看>>
Android studio 跟踪 Gradle Task 执行
查看>>
Java面试通关要点汇总集
查看>>
从源码角度理解Handler、Looper、MessageQueue之间关系
查看>>
Bitmap 比你想的更费内存 | 吊打 OOM
查看>>
为你揭秘小程序音视频背后的故事......
查看>>
自定义侧边快速索引栏
查看>>
一种自动化检测 Flash 中 XSS 方法的探讨
查看>>
基于环信sdk实现简单即时聊天
查看>>
Java基础-Synchronized原理
查看>>
大道至简,阿里巴巴敏捷教练的电子看板诞生记
查看>>
zookeeper学习04 zookeeper收尾+dubbo前瞻
查看>>
《讲个故事》为什么IP地址与Mac地址 缺一不可
查看>>
华山论剑之浅谈iOS的生产线 工厂模式
查看>>
浅谈javascript异步发展历程
查看>>
在vscode使用editorconfig的正确姿势
查看>>
当心!你的密码正在被手机中的声音泄露!
查看>>
你用过 PropTypes 的这些类型检查么?
查看>>
H5小游戏 【篇一】 组词游戏
查看>>