WCF 第六章 序列化与编码 比较WCF序列化选项
2010-12-15 17:31 DanielWise 阅读(935) 评论(0) 编辑 收藏 举报使用WCF有很多种方式来序列化对象。确定使用哪种方法来序列化取决于一系列因素。这些因素包括你是否想要与契约共享类型,支持现有的.NET类型,保留引用以及更多。
DataContractSerializer
WCF中默认的序列化方法是DataContractSerializer.这个类存在于System.Runtime.Serialization命名空间里。DataContractSerializer是用来支持基于XSD元数据的契约共享的。它将公共语言运行时(CLR)类型映射成XSD定义的类型。这意味着XSD是可以用来在两个应用程序间交换数据的公共元数据。例如,你可以使用XSD在一个.NET应用程序和一个Java应用程序间交换数据。我们使用一个字符串来举个例子。
图片6.2 XSD类型
注意只是XSD类型在一个服务端和一个客户端交换,而不是类型信息。所以在图片6.2中,System.String或者java.lang.String的概念不作为消息交换的一部分。这允许任何一边将XSD类型映射为它们自己环境中的特殊类型。这对于初始类型是可以很好工作的。复杂类型会变成初始类型的一个扩展。所以我们该如何描述使用DataContractSerializer来将一个.NET CLR类型映射为一个XSD元数据?
正如在第二章描述的那样,[DataContract]属性可以用来标记一个类型是可序列化的。成员和属性可以使用[DataMember]属性来标记为数据契约的一部分。当开发人员定义类型是如何被序列化时这是一个非常选择进入的场景。这意味着契约是显式的,与XmlSerializer的非常选择退出模式不同。列表6.1 显示了一个复杂类型的例子,Employee, 它使用了DataContractSerializer. 我们将使用Employee类型来检查元数据以及使用DataContractSerializer 的序列化输出。这将形成与WCF内部的其他序列化方法比较的基础。
列表6.1 使用DataContractSerialization的Employee类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.Serialization; namespace Employee { [DataContract] public class Employee { private int employeeID; private string firstName; private string lastName; public Employee( int employeeID, string firstName, string lastName) { this .employeeID = employeeID; this .firstName = firstName; this .lastName = lastName; } [DataMember] public int EmployeeID { get { return employeeID; } set { employeeID = value; } } [DataMember] public string FirstName { get { return firstName; } set { firstName = value; } } [DataMember] public string LastName { get { return lastName; } set { lastName = value; } } } } |
在列表6.1显示的Employee复杂类型由列表6.2中的XSD元数据表示
列表6.2 Employee XSD 元数据
1 2 3 4 5 6 7 8 9 10 11 | <?xml version= "1.0" encoding= "utf-8" ?> <xs:schema xmlns:tns= "http://schemas.datacontract.org/2004/07/Employee" elementFormDefault= "qualified" targetNamespace= "http://schemas.datacontract.org/2004/07/Employee" xmlns:xs= "http://www.w3.org/2001/XMLSchema" > <xs:complexType name= "Employee" > <xs:sequence> <xs:element minOccurs= "0" name= "EmployeeID" type= "xs:int" /> <xs:element minOccurs= "0" name= "FirstName" nillable= "true" type= "xs:string" /> <xs:element minOccurs= "0" name= "LastName" nillable= "true" type= "xs:string" /> </xs:sequence> </xs:complexType> <xs:element name= "Employee" nillable= "true" type= "tns:Employee" /> </xs:schema> |
列表6.3显示了Employee类的元数据是如何导出的。
列表6.3 导出XSD元数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | class Program { static void Main( string [] args) { XsdDataContractExporter xsdexp = new XsdDataContractExporter(); xsdexp.Options = new ExportOptions(); xsdexp.Export( typeof (Employee)); //Write out exported schema to a file using (FileStream fs = new FileStream( "sample.xsd" , FileMode.Create)) { foreach (XmlSchema sch in xsdexp.Schemas.Schemas()) { sch.Write(fs); } } } } |
为了完成与其他序列化结构比较的基础我们还要做最后一个任务,使用DataContractSerializer来序列化一个Employee实例。列表6.4显示了这是如何完成的。
列表6.4 使用DataContractSerializer序列化
1 2 3 4 5 6 7 8 9 10 11 | class Program { static void Main( string [] args) { Employee e = new Employee(101, "Daniel" , "Dong" ); FileStream writer = new FileStream( "sample.xml" , FileMode.Create); DataContractSerializer ser = new DataContractSerializer( typeof (Employee)); ser.WriteObject(writer, e); writer.Close(); } } |
Employee类使用DataContractSerializer的序列化输出结果在列表6.5 中显示。
列表6.5 使用DataContractSerializer的被序列化的Employee类
1 2 3 4 5 6 | < Employee xmlns="http://schemas.datacontract.org/2004/07/EssentialWCF" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> < EmployeeID >101</ EmployeeID > < FirstName >Daniel</ FirstName > < LastName >Dong</ LastName > </ Employee > |
作者:DanielWise
出处:http://www.cnblogs.com/danielWise/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述