天下

记录修行的印记

WCF 数据契约(DataContract)

数据契约(DataContract)
服务契约定义了远程访问对象和可供调用的方法,数据契约则是服务端和客户端之间要传送的自定义数据类型。
一旦声明一个类型为DataContract,那么该类型就可以被序列化在服务端和客户端之间传送,如下所示。
     [DataContract]
     
public class UserInfo
     {
          
//….
     }
只有声明为DataContract的类型的对象可以被传送,且只有成员属性会被传递,成员方法不会被传递。WCF对声明为DataContract的类型提供更加细节的控制,可以把一个成员排除在序列化范围以外,也就是说,客户端程序不会获得被排除在外的成员的任何信息,包括定义和数据。默认情况下,所有的成员属性都被排除在外,因此需要把每一个要传送的成员声明为DataMember,如下所示。
    [DataContract]
    
public class UserInfo
    {
        [DataMember]
        
public string UserName
        {
            
get;
            
set;
        }
        [DataMember]
        
public int Age
        {
            
get;
            
set;
        }
        [DataMember]
        
public string Location
        {
            
get;
            
set;
        }
        
public string Zodiac
        {
            
get;
            
set;
        }
}
上面这段代码把UserInfo类声明为DataContract,将UserName、Age、Location这3个属性声明为DataMember(数据成员)。Zodiac成员没有被声明为DataMember,因此在交换数据时,不会传输Zodiac的任何信息。
DataContract也支持Name
/Namespace属性,如同ServiceContract,Name和Namespace可以自定义名称和命名空间,客户端将使用自定义的名称和命名空间对DataContract类型进行访问。
声明为DataMember的成员也可以自定义客户端可见的名称,例如:
[DataMember(Name
="Name")]
public string UserName
{
     
get;
     
set;
}
[DataMember(Name
="Age")]
public int UserAge
{
          
get;
          
set;
}
除了Name和Namespace以外,DataMember还有以下参数,它们的含义分别如下。
1)IsRequired:值为true时,要求序列化引擎检查对象是否存在该值;若无,则会有异常抛出。
2)Order:bool类型值,值为true时,序列化和反序列化过程将会按成员定义的顺序进行,这对依赖于成员位置的反序列化过程无比重要。
3)EmitDefaultvalue:为成员属性设置一个默认值。

posted on 2016-06-13 17:52 天下 阅读(258) 评论(0)  编辑 收藏 引用 所属分类: C#


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理


<2016年6月>
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789

导航

统计

常用链接

留言簿(4)

随笔分类(378)

随笔档案(329)

链接

最新随笔

搜索

最新评论