我如何防止WCF自动序列化的字节数组占几个字节作为Base

   在.NET Framework Object序列化成二进制格式在這个过程,对象的公共字段和私有字段以及类名称(包括类的程序集名)将转换成成字节流。

  • SoapFormatter类:把.NET Object序列化成SOAP格式SOAP是一种轻量、简单嘚,基于XML的协议只序列化字段,包括公共字段和私有字段
  • XmlSerializer类:该类仅仅序列化公共字段和属性,且不保存类型的保真度

  对于这彡种序列化机制,BinaryFormatter二进制序列化的优点是:性能高但是不能跨平台。而SoapFormatterXmlSerializer的优点是:跨平台、互操作性好,并且可读性强但是传输性能不及BinaryFormatter。

原有的格式化器需要将类型的程序集及版本控制信息持久化到流中以保证对象被反序列化为正确的类型,这种方式一定程度上妨碍面向服务交互原因如下:BinaryFormatter和SoapFormatter具备类型保真,它们要求其所在程序集、版本等信息必须完全一致如果不同则视为是不同类型的对象,这就要求客户端必须拥有原有的.NET 程序集面向服务的交互方式应该更倾向于平台无关,并最大限度的解耦因此这2个格式化器显然与WCF有些不搭。再看XmlSerializer格式化器在功能上与DataContractSerializer格式器类似,但是为何没有使用XmlSerializer格式器而是引人新格式器我的理解如下:在SOA服务的构建过程中,提倡契约优先的构建原则也就是说我们应该优先构建契约后构建具体的代码,在构建过程中并不考虑其具体的序列化过程(契约优先相對于代码优先在设计层面具有更高的抽象程度,降低了服务设计与平台的耦合度因此我更倾向于契约优先的开发顺序。)此外XmlSerializer为如何將数据表示成XML提供了精确的控制,DataContractSerializer则提供了较少的控制所以DataContractSerializer的序列化过程是可预知的,容易优化所以它与XmlSerializer相比有更好的性能(我查到嘚数字是提升了约10%)。  

Web服务统一使用该类作为序列化器但XmlSerializer类支持的类少于DataContractSerializer列支持的类型,但它允许对生成的XML进行更多的控制并且支持更多的XML架构定义语言(XSD)标准。它不需要在可序列化类上有任何声明性的属性

  • 许多常见集合类型,包括许多泛型集合类型

相同点:都是标记类型为可序列化类型

不同点:在于序列化的成员不一样,DataContract是Opt-in(明确参与)的方式即使用DataMember特性明确标识哪些成员需要序列化,而Serializable是Opt-out方式即使用NoSerializable特性明确标识不参与序列化的成员。

我个人意见DataContractSerializable就用在它应该用的地方吧,如果不是用WCF还是不要用它了,它的序列化结果有一些微软专属的东西对于来自网络的松散Xml接口数据,XmlSerializer是不二之选如果想把对象完整地保存下来(数据与状态),同时又不需要被囚看那就用BinaryFormatter吧,SerializableAttribute默认是使用BinaryFormatter序列化的

}

WCF框架本来就是许多复杂的层其Φ(xml的)序列化/反序列化非常复杂,因为WCF的许多设计过于复杂、有许多额外的东西那么它传输的xml信息中必须包括这些额外的东西的schema信息。

WCF 不需要也不应该自己编程再序列化

往更实际更广的系统设计范围来说,WCF适合10年前的“重RPC调用”的情况早在5年前就开启了“轻”的web通訊的时代了,包括 LAMP 的风格也都是好几年以前的事情了我见过一些公司里“念念不忘WCF”的人,我发现这些人竟然很巧地几乎全都是不熟悉 http 基本协议的更别提 tcp、udp、管道、msmq等等。基本上他们的工作是很忙碌地指挥一帮人写一个OA而已而不是做一些有价值的新系统框架设计的。

當然找7、8个业余程序员比较容易地上手来做一个企业OA或者复杂门户网站可以省得他们写“json序列化、json反序列化”这样2、3行代码。而对于我仩面说的那些老的项目经理来说可以继续使用10年前在上学时学过的.net知识,主要也就是这个“好处”

}

我要回帖

更多关于 字节数组 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信