Chinaunix首页 | 论坛 | 博客
  • 博客访问: 369897
  • 博文数量: 71
  • 博客积分: 4691
  • 博客等级: 上校
  • 技术积分: 935
  • 用 户 组: 普通用户
  • 注册时间: 2006-04-14 15:14
个人简介

who am i ... i'm back.

文章分类

全部博文(71)

文章存档

2014年(4)

2011年(1)

2010年(22)

2009年(17)

2008年(27)

我的朋友

分类: C/C++

2010-06-11 14:52:59

在WCF中,我们有3种不同的Serializer——
DataContractSerializer(定义在 System.RunTime.Serializtion namespace中)、
XMLSerializer(定义在System.XML.Serialization namespace)  ----asmx采用的Serializer、
NetDataContractSerializer (定义在System.XML.Serialization namespace)

(在C#中有BinaryFormatter)


他们不同的方式实现.NET Object的Serialization。由于DataContractSerializer和NetDataContractSerializer基 本上没有太大的区别,我们只讨论DataContractSerializer和XMLSerializer。
其中 DataContractSerializer为WCF默认的Serializer,如果没有显式定采用另外一种Serializer,WCF会创建一个 DataContractSerializer 序列化NET Object。

DataContractSerializer采用怎样的一种Mapping方式来把.NET Object转化成XML:

相关的Type必须运用System.Runtime.Serialization. DataContractAttribute,       【DataContract】
 
需要序列化的成员必须运用System.Runtime.Serialization. DataMemberAttribute。[DataMember]

    【DataContract】
      class   contract
       {
            [DataMember]
            public int a;
            ...
       }


using (FileStream fs = new FileStream(fileName, FileMode.Create))
{
      DataContractSerializer serializer = new DataContractSerializer(typeof(contract));
      
using (XmlDictionaryWriter writer = XmlDictionaryWriter.CreateTextWriter(fs))
     
{
            serializer.WriteObject(writer,  contraceInstance);
      }

}

Mapping方式:

1.        Root Element为对象的Type Name

2.        Type的Namespace会被加到XML根节点的Namespace中

3.        对象的所有成员以XML Element的形式而不是以XML Attribute的形式输出。

4.        所以对象在XML的输出顺序是按照字母排序

5.        所有成员的Elelement 名称为成员名称。

6.        不论成员设置怎样的作用域(public,protected,internal,甚至市Private),

所有运用了 DataMemberAttribute的成员均被序列化到XML中——private string ProducingArea。

7.        Type和成员必须运用DataContractAttribute和DataMemberAttribute才能被序列化。




XMLSerializer:


             [Serializable]   //must be
             [XMLRoot(''')]
             class xxxx
             {
                    public int a;


                    [XmlElement("Number")]  //change serialization element(node)'s default name
                    public string no;

                    [XmlIgnor]
                    pulic int   iNotSerialize;

                    // default constructor
                    public  xxx()    //will be called when deserialization
                    {
                    }

           }
                     
  1. Root Element被指定为类名。
  2. 不会再Root Element中添加相应的Namaspace。
  3. 对象成员以XML Element的形式输出。
  4. 对象成员出现的顺利和在Type定 义的顺序一致。
  5. 只有Public Field和可读可写得Proppery才会被序列化到XML中——比如定义在XMLProduct中的internal string ProducingArea没有出现在XML中。
  6. Type定义的时候不需要运用任何 Attribute。


  1. Root Element名称之后能为类名。
  2. 可以在Type上运用 XMLRoot,通过Namaspace参数在Root Element指定Namespace。
  3. 可以通过在类成员上运用 XMLElement Attribute和XMLAttribute Attribute指定对象成员转化成XMLElement还是XMLAttribute。并且可以通过NameSpace参数定义Namespace。
  4. 可以在XMLElement或者 XMLAttribute Attribute 通过Order参数指定成员在XML出现的位置。
  5. 可以通过XmlIgnore attribute阻止对象成员被序列化



阅读(2559) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~