zoukankan      html  css  js  c++  java
  • WCF序列化

    在WCF中,提供了专门用来序列化和反序列操作的类,该类就是DataContractSerializer类。一般而言,WCF会自动选择使用DataContractSerializer来对可序列话数据契约进行序列化,不需要开发者直接调用。WCF除了支持DataContractSerializer类来进行序列化外,还支持另外两种序列化器,这两种序列化器分别为:XMLSerializer(定义在System.XML.Serialization namespace)和NetDataContractSerializer (定义在System.XML.Serialization namespace)。XmlSerializer类不是WCF专用的类,Asp.net Web服务统一使用该类作为序列化器,但XmlSerializer类支持的类少于DataContractSerializer列支持的类型,但它允许对生成的XML进行更多的控制,并且支持更多的XML架构定义语言(XSD)标准。它不需要在可序列化类上有任何声明性的属性。

    DataContractSerializer类与NetDataContractSerializer类类似,它们之间主要的区别在于:在使用NetDataContractSerializer进行序列化时,不需要指定序列化的类型,如:

    aNetDataContractSerializer serializer =
        new NetDataContractSerializer();  // 不需要明确指定序列化的类型
    serializer.WriteObject(writer, p);
    
    // 而使用DataContractSerializer需要明确指定序列化的类型
    DataContractSerializer serializer =
                new DataContractSerializer(typeof(Order)); // 需要明确指定序列化的类型
            serializer.WriteObject(writer, p);
    
    

    使用DataContractSerializer类生成的XML文件与原始对象之间的映射关系如下(默认情况):

    1. Root Element为对象的Type Name——DataContractOrder

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

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

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

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

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

    所有运用了DataMemberAttribute的成员均被序列化到XML中,

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

    可以通过这两个Attribute(DataContractAttribute和DataMemberAttribute)制定相关的参数来生成所需的XML 结构

    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中。

    注:因为WCF中使用DataContractSerializer进行序列化和反序列化的,由于DataContractSerializer进行序列化和反序列化时,都必须事先确定对象的类型。如果被序列化对象或反序列化生成的对象包含不可知的类型,序列化或反序列化将失败。所以为了保证DataContractSerializer正常的序列化和反序列化,需要将“未知”类型加入DataContractSerializer“已知”类型列表中。可以通过两个特性设置:KnownTypeAttribute和ServiceKnownTypeAttribute。KnownTypeAttribute应用于数据契约中,用于设置继承于该数据契约类型的子数据契约,或引用其他的契约类型。ServiceKnownTypeAttribute既可以应用于服务契约的接口和方法上,还可以应用在服务实现的类和方法上,应用在不同的目标元素,决定了定义已知类型的作用范围

    使用XmlSerializer类生成的XML文件与原始对象之间的映射关系如下(默认情况):

    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。

    可以通过XML相关的一些Attribute来生成所需的XML 结构

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

    两种不同的Serializer区别:

    特性

    XMLSerializer

    DataContractSerializer

    默认Mapping

    所有Public Field和可读可写Property

    所有DataMember Filed、Property

    是否需要Attribute

    不需要

    DataContract DataMember或者Serializable

    成员的默认次序

    Type中定义的顺序

    字母排序

    兼容性

    .asmx

    Remoting

    Deserialzation

    调用默认构造函数

    不会调用

     

     

    该篇文章参考和引用了以下作者的文章内容:

    我的WCF之旅(4):WCF中的序列化[上篇]

    我的WCF之旅(4):WCF中的序列化[下篇]

    跟我一起学WCF(7)——WCF数据契约与序列化详解

    文章同步发表于我的个人网站:http://www.zuowenjun.cn/post/2015/03/25/134.html

  • 相关阅读:
    VUE权限列表控制
    VUE-element-UI修改内置样式
    微信开发-url地址传值踩坑
    git 上传命令
    微信开发-缩略图插件
    axios拦截器
    设置contentType
    JSON.parse 函数应用 (复制备忘)
    angularjs开发遇到的坑
    http 请求头
  • 原文地址:https://www.cnblogs.com/zuowj/p/4366946.html
Copyright © 2011-2022 走看看