Tuesday, June 16, 2009

WCF Serialization

WCF中的序列化


[DataContract(Namespace = "http://webabcd.cnblogs.com/")]
public class DataContractSerializerObject
{
   // Name - 数据成员的名称
   // Order - 数据成员的序列化和反序列化的顺序
   [DataMember(Name = "UniqueID", Order = 0)]
   public Guid ID { get; set; }
  
   [DataMember(Order = 1)]
   public string Name { get; set; }
  
   [DataMember(Order = 2)]
   public int Age { get; set; }
  
   [DataMember(Order = 3)]
   public DateTime Time { get; set; }
}

生成XML是怎样的? 以下的Mapping关系:

1、Root Element为对象的Type Name——DataContractOrder
2、Type的Namespace会被加到XML根节点的Namespace中http://schemas.datacontract.org/2004/07/Artech.WCFSerialization
3、对象的所有成员以XML Element的形式而不是以XML Attribute的形式输出。
4、所以对象在XML的输出顺序是按照字母排序。
5、所有成员的Elelement 名称为成员名称。
6、不论成员设置怎样的作用域(public,protected,internal,甚至市Private),所有运用了DataMemberAttribute的成员均被序列化到XML中——private string ProducingArea。
7、Type和成员必须运用DataContractAttribute和DataMemberAttribute才能被序列化。

上面这些都是默认的Mapping关系,在通常情况下我们用默认的这种Mapping往往不能满足我们的需求,为了 把.NET序列化成我们需要的XML 结构(比如我们的XmL必须于我们预先定义的XSD一致),我们可以在这两个Attribute(DataContractAttribute和 DataMemberAttribute)制定相关的参数来实现。具体做法如下。

1、Root Element可以通过DataContractAttribute中的Name参数定义。
2、Namespace可以通过DataContractAttribute中的NameSpace参数定义。
3、对象的成员只能以XML Element的形式被序列化。
4、对象成员对应的XML Element在XML出现的位置可以通过DataMemberAttribute的Order参数来定义。
5、对象成员对应的Element的名称可以通过DataMemberAttribute中的Name定义。
6、如果不希望某个成员输出到XML中,可以去掉成员对应的DataMemberAttribute Attribute。
此外DataMemberAttribute还有连个额外的参数:
1、IsRequired:制定该成员为必须的,如果通过工具生成XSD的话,对应的Element的minOccur=“1”。
2、EmitDefaultValue:制定是否输入没有赋值的成员(值为默认值)是否出现在XML中。