WCF学习笔记(三),数据契约

2024-03-06 08:32
文章标签 数据 学习 笔记 wcf 契约

本文主要是介绍WCF学习笔记(三),数据契约,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 WCF能够托管CLR类型,客户端能传递和处理CLR类型的数据(如:string和int),但是如果我们自己定义的类型(如:声明的Customer类)。其实WCF的传递CLR自己类型时,是因为已经把它序列化成了xml信息集,而我们自己定义的类型则需要自己去显示的声明序列化。

序列化
    .net的序列化。.net是通过反射机制自动实现对象的序列化与反序列化。首先.net能够捕获对象每个字段的值,然后进行序列化,反序列化时,.net创建一个对应类型的新的对象,读取持久化的值,然后设置字段的值。.net对象状态的序列化到Stream中。
    我们自定义的类或者结构是不支持序列化的,因此如果我们的类是否要序列化是需要类的开发者来指定的。如果需要支持序列化的话,我们可以在类或者结构上添加Serializable属性。
    如:
    [Serializable]
    public class Customer
    {
        ...
    }
    但是如果添加了Serializable就要求类型的成员也要支持序列化的,不然会抛出异常,但是我们可以通过在成员上添加NonSerizlized属性来说明这个成员不需要序列化。

格式
    .net为序列化和反序列化提供了两种格式器:
            1.BinaruFormatter:将类型序列化为二进制格式。
            2.SoapFormatter:格式成SOAP特定的XML格式。
    但是这两者都要将类型的程序集以及版本控制信息持久化到Stream中,而面向服务要求参与者都能拥有类型程序集,所以如果用这两种格式就必须要去共享Stream,这样肯定不是我们理想的。从而有了WCF格式器。
    
    WCF的格式器:DataContractSerializer,是能够共享数据契约的。WCF数据进行序列化时,WCF一般会自己调用DataContractSerializer来序列的,不需要我们去指定的。同时我们也可以用DataContractSerializer进行Stream的序列化。

数据契约特性
    Serializable要求类型的所有的成员都是可以序列化的,而且不支持类型名跟成员名的别名,这样我们就没法明确指定哪些成员是要放到数据契约中的。然而WCF数据契约特性DataContract很好的解决了这些问题。
    DataContract Attribute 是在命名空间System.Runtime.Serialization中的,是可以在Enum、Struct、Class上标识的。拥有成员Name,Namespace。而当我们在一个class或者struct上使用时,wcf是不会序列化类型的成员的。如:
        [DataContract]
        public class Emloyee
        {
            public string _firstName;
            public string _lastName;
        }
Employee里面的成员_firstName,_lastName是不会去序列化的,所以我们还必须去显示的指定需要序列化的成员。
    DataMember Attribute是用来指定需要序列化类型的成员。DataMember的成员:
        IsRequried:序列化时是否必须要赋值;
        Name:指定成员的别名;
        Order:指定序列化后的排列位置。
我们看一个例子Customer.cs:

altusing System;
alt
using System.Collections.Generic;
alt
using System.Linq;
alt
using System.Text;
alt
using System.ServiceModel;
alt
using System.Runtime.Serialization;
alt
alt
namespace HenllyeeDataContract
alt
{
alt    [DataContract(Name
="Customer",Namespace="HenllyeeDataContract")]
alt    
public class Customer
alt    
{
alt        
Fileds
alt        
alt        
Attributes
alt    }

alt}

alt

 上面我们定义了一个数据契约,将DataMember属性定义在几个属性上(建议定义在属性上,不要定义在字段上)。

服务契约为:

alt using  System;
alt
using  System.Collections.Generic;
alt
using  System.Linq;
alt
using  System.Text;
alt
using  System.ServiceModel;
alt
alt
namespace  HenllyeeServiceContract
alt
{
alt    [ServiceContract(Name
="CustomerManagerService",Namespace="www.systhinker.com,专注、技术、共享2008/06/29")]
alt    
public interface ICustomerManager
alt    
{
alt        
/// 
alt        
/// Save customer's info
alt        
/// 

alt        
///  the customer's object

alt        [OperationContract(Name="SaveCustomerInfo",Action="www.systhinker.com,专注、技术、共享2008/06/29/CustomerManagerService/SaveCustomer",
alt            ReplyAction 
= "www.systhinker.com,专注、技术、共享2008/06/29/CustomerManagerService/SaveCustomerResponse")]
alt        
void SaveCustomer(HenllyeeDataContract.Customer customer);
alt
alt        
/// 
alt        
/// Get customer's info
alt        
/// 

alt        
///  a customer

alt        [OperationContract(Name = "GetCustomerInfo", Action = "www.systhinker.com,专注、技术、共享2008/06/29/CustomerManagerService/GetCustomer",
alt            ReplyAction 
= "www.systhinker.com,专注、技术、共享2008/06/29/CustomerManagerService/GetCustomerResponse")]
alt        HenllyeeDataContract.Customer GetCustomer();
alt    }

alt}

alt

服务契约里面具体实现:

alt using  System;
alt
using  System.Collections.Generic;
alt
using  System.Linq;
alt
using  System.Text;
alt
using  System.ServiceModel;
alt
alt
namespace  HenllyeeServiceContract
alt
{
alt    [ServiceBehavior(InstanceContextMode 
= InstanceContextMode.Single)]
alt    
public class CustomerManager:ICustomerManager
alt    
{
alt        
fileds
alt
alt        
Members
alt    }

alt}

alt



主机的实现就不在次给出了。
然后我们在客户端添加服务引用,即可以了。我们在客户端可以看到导入的数据契约:

alt     [System.Diagnostics.DebuggerStepThroughAttribute()]
alt    [System.CodeDom.Compiler.GeneratedCodeAttribute(
" System.Runtime.Serialization " " 3.0.0.0 " )]
alt    [System.Runtime.Serialization.DataContractAttribute(Name
= " Customer " , Namespace = " HenllyeeDataContract " )]
alt    [System.SerializableAttribute()]
alt&

WCF学习笔记系列链接:

WCF学习笔记(一),WCF预览

WCF学习笔记(二),服务契约

WCF学习笔记(三),数据契约

WCF学习笔记(四),数据契约的事件

WCF学习笔记(五),数据契约的已知类型

WCF学习笔记(六),实例类型

这篇关于WCF学习笔记(三),数据契约的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/779427

相关文章

使用Python将JSON,XML和YAML数据写入Excel文件

《使用Python将JSON,XML和YAML数据写入Excel文件》JSON、XML和YAML作为主流结构化数据格式,因其层次化表达能力和跨平台兼容性,已成为系统间数据交换的通用载体,本文将介绍如何... 目录如何使用python写入数据到Excel工作表用Python导入jsON数据到Excel工作表用

Mysql如何将数据按照年月分组的统计

《Mysql如何将数据按照年月分组的统计》:本文主要介绍Mysql如何将数据按照年月分组的统计方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql将数据按照年月分组的统计要的效果方案总结Mysql将数据按照年月分组的统计要的效果方案① 使用 DA

鸿蒙中Axios数据请求的封装和配置方法

《鸿蒙中Axios数据请求的封装和配置方法》:本文主要介绍鸿蒙中Axios数据请求的封装和配置方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1.配置权限 应用级权限和系统级权限2.配置网络请求的代码3.下载在Entry中 下载AxIOS4.封装Htt

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析

Python获取中国节假日数据记录入JSON文件

《Python获取中国节假日数据记录入JSON文件》项目系统内置的日历应用为了提升用户体验,特别设置了在调休日期显示“休”的UI图标功能,那么问题是这些调休数据从哪里来呢?我尝试一种更为智能的方法:P... 目录节假日数据获取存入jsON文件节假日数据读取封装完整代码项目系统内置的日历应用为了提升用户体验,

Java利用JSONPath操作JSON数据的技术指南

《Java利用JSONPath操作JSON数据的技术指南》JSONPath是一种强大的工具,用于查询和操作JSON数据,类似于SQL的语法,它为处理复杂的JSON数据结构提供了简单且高效... 目录1、简述2、什么是 jsONPath?3、Java 示例3.1 基本查询3.2 过滤查询3.3 递归搜索3.4

MySQL大表数据的分区与分库分表的实现

《MySQL大表数据的分区与分库分表的实现》数据库的分区和分库分表是两种常用的技术方案,本文主要介绍了MySQL大表数据的分区与分库分表的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有... 目录1. mysql大表数据的分区1.1 什么是分区?1.2 分区的类型1.3 分区的优点1.4 分

Mysql删除几亿条数据表中的部分数据的方法实现

《Mysql删除几亿条数据表中的部分数据的方法实现》在MySQL中删除一个大表中的数据时,需要特别注意操作的性能和对系统的影响,本文主要介绍了Mysql删除几亿条数据表中的部分数据的方法实现,具有一定... 目录1、需求2、方案1. 使用 DELETE 语句分批删除2. 使用 INPLACE ALTER T

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1

Redis 中的热点键和数据倾斜示例详解

《Redis中的热点键和数据倾斜示例详解》热点键是指在Redis中被频繁访问的特定键,这些键由于其高访问频率,可能导致Redis服务器的性能问题,尤其是在高并发场景下,本文给大家介绍Redis中的热... 目录Redis 中的热点键和数据倾斜热点键(Hot Key)定义特点应对策略示例数据倾斜(Data S