[讨论]讨厌或不懂WCF的进
Windows Communication Foundation(WCF)是由微软发展的一组数据通信的应用程序开发接口,其功能非常丰富。有人讨厌并反对使用它,其理由无非是效率低。我在这里推荐学习它,但最终是否使用不表态。
WCF效率低下的原因主要是序列化的问题。WCF默认采用XML序列化,而用来发送消息之前,必须先将对象进行第一次XML序列化,包装到Message类型中去,然后使用指定的序列化类进行第二次序列化(格式化)。为什么说它进行了2次序列化呢,因为我断点跟踪自定义绑定类进去看过,同时那个NetDataContractSerializer继承“XmlObjectSerializer,IFormatter”也是最好的证明,即使替换其它序列化类,也必须继承那个抽象类和接口,第二次序列化类似格式化。
另外WCF序列化后的内容是非常庞大的,导致了传输过程浪费带宽。
但是WCF却是值得学习的,因为那个为我们考虑了很多通讯方面的设定,比如各种超时、传输模式、缓存大小、REST风格等,即使自己用Socket来写,借鉴WCF的好的地方也是非常值得的,因此不能否定WCF。
对于WCF效率低下,我考虑过很多方案,也在网上搜索过很多资料,最终只能用妥协的方法处理,就是修改返回值类型为Stream。如此一来,序列化过程自己控制,只需要序列化一次即可。之后虽然WCF会对Stream也进行包装,但是不会再次序列化,仅仅是进行了普通的流读取操作。这样做的另一个好处是,可以使用第三方的序列化类进行序列化,大大减少序列化后产生的数据量,减少网络带宽的消耗。不过缺点也很明显,就是返回值类型无法直接推断了,不直观,但比起直接用Socket还是好理解多了。
对于返回值类Stream的情况,如果WCF同时启用了Streamed模式传输,还可以通过构造无缓存流来实现真正的无缓存数据返回。多数情况下,要无缓存返回流是不可能的,必须要构造一个MemoryStream,然后把数据都写入其中,再通过函数返回,当然直接返回FileStream也可以,但是先序列化到文件中的话,速度自然会降低。因此要实现序列化和网络发送同步进行,这看似只有Socket直接编程才能做到,不过利用流特性也是可以实现的,有关无缓存流,下次分解。