原创

C#-序列化相关配置-DataContract-DataMember-顺序-System.Runtime.Serialization-SOAP消息-忽略null


特别注意
[DataMember (Name="admin")] //重命名
只有添加了 [DataMember] 才会在请求返回时包含相应字段
如果接口参数是一个实体,例如UserInfo,而不是要给简单数据类型,此时要求实体必须都加上[DataMember] ,并且不能重命名,否则参数花查询时找不到参数

只有声明为DataContract的类型的对象可以被传送,且只有成员属性会被传递,成员方法不会被传递。WCF对声明为DataContract的类型提供更加细节的控制,
可以把一个成员排除在序列化范围以外,也就是说,客户端程序不会获得被排除在外的成员的任何信息,包括定义和数据。默认情况下,
所有的成员属性都被排除在外,因此需要把每一个要传送的成员声明为DataMember,如下所示。

添加程序集
System.Runtime.Serialization
最好都实现get set方法(注:这个方法支持重写)
{
[DataContract]
public class UserInfo{

[DataMember]
public string UserName {get;set;}

[DataMember]
public int Age {get;set;}

[DataMember]
public int Location{get;set;}

//未添加注解
public int Zodiac{get;set;}
}

另外可以指定字段名称
[DataMember(Name="Name")]
public string UserName {get;set;}

除了Name和Namespace以外,DataMember还有以下参数,它们的含义分别如下。

(1)IsRequired:值为true时,要求序列化引擎检查对象是否存在该值;若无,则会有异常抛出。
(2)Order:bool类型值,值为true时,序列化和反序列化过程将会按成员定义的顺序进行,这对依
赖于成员位置的反序列化过程无比重要。
[DataMember(Order = 0)]
public string bird;
(3)EmitDefaultvalue:为成员属性设置一个默认值。不需要显示null时,如下设置
[DataMember(EmitDefaultValue=false)]
public String OpState { get; set; }

如果有多个注解,使用逗号连接
[DataMember(EmitDefaultValue = false, Order = 2)]

更多官方解释:

DataMemberAttribute 类
https://msdn.microsoft.com/zh-cn/library/system.runtime.serialization.datamemberattribute.aspx
数据成员顺序
https://msdn.microsoft.com/zh-cn/library/ms729813.aspx

其他扩展介绍
http://www.cnblogs.com/liulanle/archive/2013/02/26/2933699.html

另外关于soap消息:

把一个类型声明为MessageContract,意味着它可以被序列化为SOAP消息,可以声明类型的成员为SOAP消息的各个部分,如Header、Body等,如下所示。

[MessageContract]
public class UserMessage
{
private string user = String.Empty;
private string authKey = String.Empty;

[MessageBodyMember(
Name = "UserName",
Namespace = "http://www.wcf.com")]
public string User
{
get { return user; }
set { user = value; }
}

[MessageHeader(
Name = "AuthKey",
Namespace = "http://www.wcf.com",
MustUnderstand = true
)]
public string AuthKey
{
get { return authKey; }
set { this.authKey = value; }
}
}

User成员被声明为MessageBody(消息体)的一个成员,AuthKey被声明为消息头(MessageHeader)的一个成员。这个类将可以生成如下的SOAP消息。

<s:Envelope>
<s:Header>
<a:Action s:mustUnderstand="1">http://UserMessage/Action</a:Action>
<h:AuthKey s:mustUnderstand="1" xmlns:h="http://www.wcf.com">xxxx</h:AuthKey>
</s:Header>
<s:Body>
<UserMessage xmlns="Microsoft.WCF.Documentation">
<User xmlns="http://www.wcf.com">abcd</User>
</UserMessage>
</s:Body>
</s:Envelope>
MessageHeader中,MustUnderstand参数表示读取该头的程序必须能够识别头的内容,否则不能继续处理。Name/Namespace的作用与前面的元素相同。
另有Relay参数,若为true,头的内容被接收到以后会在响应消息中回发给消息发送端。
正文到此结束
本文目录