对象序列化

WCF是通过网络实现远程方法调用的,因此参数,返回值等都需要序列化才能在网络间传输。例如,对于下面的一个服务:

[ServiceContract]
    public interface IService1
    {
        [OperationContract]
        Point GetRandomPoint();
    }

public class Point
    {
        public int X { get; set; }
        public int Y { get; set; }
    }

public class Service1 : IService1
    {
        public Point GetRandomPoint()
        {
            var rnd = new Random();
            return new Point() { X = rnd.Next(), Y = rnd.Next() };
        }
    }

可以通过WCF测试客户端查看其数据是如何传输的。

从中我们可以看到,对于返回值Point,是将其序列化成了Xml格式后传递的,在WCF中,默认是通过DataContractSerializer序列化对象的,它可以将对象序列化成XML,我们也可以手动编码实现这一过程。

var point = new Point(){X = 1,Y = 2};
    var serializer = new DataContractSerializer(typeof(Point));
    serializer.WriteObject(stream, point);

序列化控制

从前面的例子可以看到,即使什么都不干,只要定义了一个对象,DataContractSerializer就能将其序列化。但这个默认的序列化方式是直接根据字段名称来序列化的,很多时候,为了实现更好的版本控制,往往需要我们控制序列化格式。

一个简单的示例如下:

[DataContract]
    public class Point
    {
        [DataMember(Name="PointX")] public int X { get; set; }
        [DataMember(Name="PointY")] public int Y { get; set; }
    }

实现这个序列化控制后,执行结果为:

从这个例子中可以看到,和传统的XmlSerializer一样,WCF是通过一些Attribute进行序列化控制的,基本方式为:

  1. 通过DataContract标志要序列化的对象
  2. 通过DataMember标志序列化成员,并通过参数控制序列化过程。

当然,其序列化控制手段远远不止这么点,更多信息可以参看MSDN:创建类或结构的基本数据协定。

将对象序列化成Json格式

XML虽然具有良好的可读性,但开销非常大,增大了网络传输负担,对于那些网速不够快的场景则需要开销更小的序列化格式,一种比较常用的开销更小的序列化格式就是Json。

WCF是一个通用的网络传输平台,在WCF中,可以借助DataContractJsonSerializer实现序列化对象为Json格式。例如,对于前面的那个Point结构,可以序列化为如下形式:

{"PointX":1,"PointY":2}

可以看到,DataContract的序列化控制对DataContractJsonSerializer也是生效的,这说明DataContract是一个通用的序列化控制手段,这也是它们叫DataMember这类比较抽象的名字,而不是叫XmlElement之类的具体名字的原因。

要把WCF服务配置成以Json方式传输数据格式,可以参考这篇文章Using WebHttpBinding & JSON Support in WCF。

注意事项

在WCF传输数据时,注意返回的对象类型不能是返回值类型的子类(Stream除外)。拿前面的例子来说,修改代码为:返回一个Point的子类Point3D对象。

public class Point3D : Point
    {
        public int Z { get; set; }
    }

public class Service1 : IService1
    {
        publicPointGetRandomPoint()
        {
            var rnd = new Random();
            return newPoint3D() { X = rnd.Next(), Y = rnd.Next() };
        }
    }

这个时候是完全能通过编译并运行的,但是调用函数的时候就会出现如下错误:

这个主要还是传输的数据格式不匹配造成的,WCF中可以使用KnownTypeAttribute标记解决这一问题,具体可以参看MSDN文章数据协定继承,这里就不多介绍了。

WCF入门(三)——对象序列化相关推荐

  1. 分布式系列三: 对象序列化

    序列化可以解决分布式系统节点间复杂对象传输的问题. 将对象状态转化为可存储或可传输的过程叫序列化, 而反序列化是将其还原成对象的过程. 几种序列化机制 JDK的序列化 Java默认的序列化要求实现Se ...

  2. 第三百零九节,Django框架,models.py模块,数据库操作——F和Q()运算符:|或者、并且——queryset对象序列化...

    第三百零九节,Django框架,models.py模块,数据库操作--F()和Q()运算符:|或者.&并且 F()可以将数据库里的数字类型的数据,转换为可以数字类型 首先要导入 from dj ...

  3. Pascal游戏开发入门(三):游戏对象管理

    Pascal游戏开发入门(三):游戏对象管理 游戏中有很多类对象,例如:角色,敌人,NPC,陷阱,子弹,门等等.跟踪并处理它们之间的交互是一个有难度的事情.为了尽可能简化并使之容易维护,本节将尝试使用 ...

  4. java对象序列化克隆_Java8基础知识(三)对象克隆与序列化

    对象克隆 对象克隆最简单的方式是:将对原对象的引用直接传给一个新的副本变量.这种方式存在很大的缺陷,两个变量中任何一个变量的改变都会影响另一个变量. 浅拷贝 利用Object类的clone方法,能够创 ...

  5. java 反射 transient_JAVA 对象序列化(三)——transient以及Externalizable的一种替代方法(使用Serializable)...

    transient(瞬时)关键字 当我们队序列化进行控制时,可能某个特定子对象不想让Java的序列化机制自动保存与恢复.如果子对象表示的是我们不希望将其序列化的敏感信息(如密码),通常就会面临这种情况 ...

  6. C#-异步编程及WCF入门

    异步编程 异步代码在等待I/O请求响应的同时,可通过生成更多的线程,处理更多的请求 异步代码在等待I/O请求的同时,可生成UI交互线程,并通过将耗时的工作转移到其他CPU内核的方式,让UI的响应速度更 ...

  7. [WCF编程]1.WCF入门示例

    一.WCF是什么? Windows Communication Foundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架,整合了原有的windows通讯的 .net Remotin ...

  8. .Net 3.5 Remoting编程入门三

    VS2008 .Net 3.5 Remoting编程入门三 信道 什么是信道?信道有哪些类型呢? 信道顾名思意就是通信的通道.就想那些宣传标语说的,"要想富,先修路!".同理,要学 ...

  9. WCF 入门 WCF基础知识问与答

    学习WCF已有近两年的时间,其间又翻译了Juval的大作<Programming WCF Services>,我仍然觉得WCF还有更多的内容值得探索与挖掘.学得越多,反而越发觉得自己所知太 ...

最新文章

  1. Writing Images to the Excel Sheet using PHPExcel--转载
  2. 用Swashbuckle(swagger-ui)显示API帮助并进行调试
  3. Python 第三方模块之 numpy.random
  4. JDBC批量Insert深度优化(有事务)
  5. phylip软件_进化树专题(五)| 密码子分区软件介绍
  6. 兆比特每秒和兆字节每秒_宽带中的“M(兆)”是什么意思?
  7. SVN安装及使用+SVN汉化
  8. 腾讯X5内核浏览器的使用
  9. 微波射频学习笔记2--------传输线理论
  10. CANoe软件使用(一)——软件界面介绍
  11. Python自做的一个zabbix_sender程序
  12. 电脑时间倒流,程序拒绝穿越:应用程序发生异常 未知的软件异常(0xe06d7363)
  13. 安卓手机怎么删除html文件,安卓手机如何打开和删除7z文件?
  14. PS 图片部分位置调亮
  15. 田老师书法工作室学员作品展(二)
  16. mysql rebuild index_批量rebuild索引
  17. 为什么高一的学生都说数学难?
  18. matlab地球绕太阳,matlab 怎么做地球绕太阳转 同时 月球绕地球转 动态的 可以做成圆周运动 二维的 一分钟左右...
  19. 1元秒杀,1小时145人购买,高达1分钟2人+购买,有人错过了,要求追加1元秒杀...
  20. 【NRF51822】百度手环开源源码分析--底层通讯部分

热门文章

  1. 教育园报修系统_【务实活动】“充电”模式强力开启,务实幼教2019暑期小红巾生存教育大培训...
  2. Kali Linux安装字典StarDict
  3. 数据包发包工具bittwist
  4. 磁盘镜像工具Guymager
  5. 查看服务器CPU配置信息,转帖-CentOS查看CPU信息、位数、多核信息;查看服务器硬件信息...
  6. java cdata xml 解析,如何解析lt;![CDATA []]gt;的XML
  7. 卡牌系统psv游戏推荐_索尼PSV已经凉了吗?等等,2020年六月还有一款PSV游戏发售...
  8. 用python画玫瑰花简单-利用python的turtle库画一朵简单的玫瑰花,并添加文字
  9. Ubuntu环境下TensorFlow 的环境搭建(二)安装TensorFlow(CPU版)
  10. 未来50年的神经科学会是什么样呢?