文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>WCF 序列化 DataContractSerializer & XMLSerializer

WCF 序列化 DataContractSerializer & XMLSerializer

时间:2010-06-11  来源:wuye_chinaunix

在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阻止对象成员被序列化



相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载