仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 741|回复: 11
打印 上一主题 下一主题

[学习教程] ASP.NET编程:XmlSerializer, DataContractSerializer 和 BinaryFormatter区分与用法剖析仓酷云 ...

[复制链接]
萌萌妈妈 该用户已被删除
跳转到指定楼层
#
发表于 2015-1-18 11:18:48 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
效率会有不少的变化。而实际上net网页编程是基于堆栈机器来设计,这和我们常见的基于寄存器的本地机器是差异比较大的。总体来说,这是一种虚拟机的设计思路。.NET供应了良多序列化对象的办法,懂得他们之间的区分才干更好地断定利用哪种序列化体例并准确地利用。本文从上面几个方面临题目中的三种序列化办法举行了剖析。


  • 局限:PropertyOrFieldOrBoth
  • 可见性:PublicorPrivateOrAll
  • 可会见性:ReadonlyProperty
  • 回调:指OnSerializing,OnSerialized,OnDeserializing,OnDeserialized这些回调。
  • 包括轮回援用的对象
  • 包括Dictionary的对象
  • 乱序读(XML)
  • 自界说序列化了局。
  • 对被序列化的类有无甚么Attribute请求。偶然被序列化的对象位于第三方库中,没法修正源代码,假如要序列化如许的对象,就不克不及利用必定要有Attribute的Serializer。
先把了局收拾出来再剖析:代码能够从这里下载,所写测试大概其实不周全,以是假如有甚么毛病,接待人人指出,否则要误人后辈了。不外有这篇更误人后辈的文章殿底(Googletop1),我信任这个表不会更糟。
XmlSerializerDataContractSerializerBinaryFormatter局限BothBothFieldOnly可见性PublicOnlyAllAll只读属性不撑持撑持,但要加AttributeN/A回调撑持不撑持撑持撑持轮回援用不撑持撑持,但要加Attribute撑持Dictionary不撑持撑持,专有格局撑持乱序读撑持不撑持不撑持自界说格局撑持,要加Attribute不撑持XmlAttribute经由过程接口Attribute请求不用要不用要必需有Serializable
有几点必要注释一下。
功能?巨细?

在我写的几个测试用例中,不管关于复杂对象,仍是嵌套对象,仍是数组反复援用对象,这几个Serializer的功能和巨细基础在一个数目级上。他们之间功效上的差别宏大于他们功能上的差别。这个时分,利用哪一个办法的决议应当取决于功效及其束缚,而不是功能。假如你在乎功能,应当用第三方库,如Google的protobuf-net。不管从功能、序列化了局的巨细仍是兼容性上,protobuf-net比这三者都要优异,固然,nothumanreadable。
Attribute请求

很多同类文章都宣称XmlSerializer和DataContractSerializer都请求在类上加响应的Attribute。但现实上并非如许。只要当你想要改动默许的序列化了局时,Attribute才是需要的。
最多见的一个毛病就是,给XmlSerializer要用到的类加SerializableAttribute。这个Attribute实际上是给BinaryFormatter和SoapFormatter用的,一样平常用在Remoting和Messaging上。
乱序读

乱序读的意义是,Deserialize的过程当中,不合错误Xml节点的按次做请求。Xml自己就是一种标志性的,带有声明性的言语,多半基于Xml的收集协定都不会对Xml节点的按次做请求。好比罕见的RSS,ATOM,OPDS等。
WCF利用的DataContractSerializer请求Xml节点按次要末严厉指定,要末按字母按次分列,也许有功能上思索,可是WCF的定位才是同意DataContractSerializer严厉请求Xml节点按次的基本缘故原由。WCF自己是用于通讯的,其对序列化的定位,仅仅只是动静传送的手腕,动静格局的严厉界说并没有甚么欠好,并且挪用方的代码都能够经由过程WSDL来天生,天然也就更不会呈现剖析时的成绩。以是不撑持乱序读完整是由其功效设定决意的。
XmlSerializer,在我看来能够做为ObjectXmlMapping的工具,固然要尽量撑持一切Xml的尺度。
自界说的撑持

XmlSerializer和DataContractSerializer都撑持IXmlSerializer接口。经由过程这个接口DataContractSerializer乃至能够撑持Attribute,可是,这实在已不是在利用DataContractSerializer的序列化机制了。并且在实践项目中也不具有可操纵性。以是在上表中,仍是把DataContractSerializer标志为不撑持XmlAttribute。
另有一些罕见的接口,如ISerializable和IDeserializationCallback是给BinaryFormatter用的,以撑持自界说序列化的历程。这里我很奇异为了BinaryFormatter已撑持了OnDeserializedAttribute,为何另有这么个接口来供应类似的功效。
一些小的细节

两个Xml序列化办法另有一些小的挺成心思的不同,我试图推测发生这类差别的缘故原由,却没想出来,也许是一些微软员工不为人知的计划理念,大概只是写代码时的顺心而为而已。

  • XmlSerializer不序列化Null值,DataContractSerializer默许会序列化Null值。
  • DataContractSerializer与Attribute:对没有任何Attribute的类,序列化一切Public的可读可写Property和Field;对仅仅加了SerializableAttribute的类,序列化一切可见性的Field(为了和BinaryFormatter举动分歧吗);假如仅仅加了DataContractAttribute,则甚么都不会序列化出来,必定要加DataMember。
  • DataContract撑持序列只读属性,可是属性上要加DataMember.
  • DataContractSerializer,仅仅加DataMember而不加DataContract会出非常。
  • DataContractSerializer与ISerializable接口不兼容,间接抛非常。
  • DataContractSerializer撑持IXmlSerializer接口,可是完成了这个接口,就不克不及加DataContract了。不然抛非常。这是甚么事理?
  • XmlSerializer撑持乱序读的价值是,你不克不及把持你本人的天生的Xml的节点的按次。也就是说ElementNameAttribute中不克不及指定Order。
  • BinaryFormatter请求被序列化的类必需“满城尽带Serializable”。以是假如你改不了源代码,序列化不了就是序列化不了。而XmlSerializable,你尽能够经由过程承继的体例,把Internal和Protected的Property序列化出来。
小结

基于下面的客不雅了局,信任你已有了本人的判别。我团体定见,DataContractSerializable就用在它应当用的中央吧,假如不是用WCF,仍是不要用它了,它的序列化了局有一些微软专属的工具。关于来自收集的松懈Xml接口数据,XmlSerializer是不贰之选。假如想把对象完全地保留上去(数据与形态),同时又不必要被人看。那就用BinaryFormatter吧。假如对功能或是数据巨细请求对照高,那这三个就都能用,用protobuff吧。
增补

这些信息算是一种履历,可是相对不合适作口试或是口试题用。

2012年6月2日:
发明一个不错的总结:

http://www.codeproject.com/Articles/255684/Create-and-Consume-RESTFul-Service-in-NET-Framewor前几天同学问我学习方向的问题。有点想法,不知道对不对,怕误导同学,现在“开源一下”。注:括号内是我现在整理的时填加上的。
若天明 该用户已被删除
11#
发表于 2015-3-24 03:06:54 | 只看该作者
JSP/Servlet虽然在国内目前的应用并不广泛,但是其前途不可限量。
蒙在股里 该用户已被删除
10#
发表于 2015-3-17 08:11:33 | 只看该作者
Asp.net:首先来说,Asp.net和Asp没什么关系,看着像是升级版本什么的,其实没什么联系。Asp是脚本编程,用的是ASP语言,而ASP.net用的是C#语言,完全不同的东西。
小魔女 该用户已被删除
9#
发表于 2015-3-6 00:35:47 | 只看该作者
有一丝可惜的是,这个系列太强了,Java阵营的朋友根本就是哑口无言...争论之火瞬间被浇灭,这不是我想这么早就看到的,但是值了。
变相怪杰 该用户已被删除
8#
发表于 2015-3-2 14:58:36 | 只看该作者
比如封装性、继承性、多态性等等,这就解决了刚才谈到的ASP的那些弱点。封装性使得代码逻辑清晰,易于管理,并且应用到ASP.Net上就可以使业务逻辑和Html页面分离,这样无论页面原型如何改变。
愤怒的大鸟 该用户已被删除
7#
发表于 2015-2-11 15:50:33 | 只看该作者
以上是语言本身的弱点,在功能方面ASP同样存在问题,第一是功能太弱,一些底层操作只能通过组件来完成,在这点上是远远比不上PHP/JSP,其次就是缺乏完善的纠错/调试功能,这点上ASP/PHP/JSP差不多。
飘灵儿 该用户已被删除
6#
发表于 2015-2-5 11:52:25 | 只看该作者
现在的ASP.net分为两个版本:1.1和2.0Asp.net1.1用VS2003(visualstudio2003)编程。Asp.net2.0用VS2005(visualstudio2005)编程。现在一般开发用的是VS2003。
只想知道 该用户已被删除
5#
发表于 2015-2-4 13:18:54 | 只看该作者
虽然在形式上JSP和ASP或PHP看上去很相似——都可以被内嵌在HTML代码中。但是,它的执行方式和ASP或PHP完全不同。在JSP被执行的时候,JSP文件被JSP解释器(JSPParser)转换成Servlet代码,然后Servlet代码被Java编译器编译成.class字节文件,这样就由生成的Servlet来对客户端应答。所以,JSP可以看做是Servlet的脚本语言(ScriptLanguage)版。
小妖女 该用户已被删除
地板
发表于 2015-2-1 22:36:08 | 只看该作者
ASP.Net摆脱了以前ASP使用脚本语言来编程的缺点,理论上可以使用任何编程语言包括C++,VB,JS等等,当然,最合适的编程语言还是MS为.NetFrmaework专门推出的C(读csharp)。
金色的骷髅 该用户已被删除
板凳
发表于 2015-1-26 21:40:09 | 只看该作者
Servlet却在响应第一个请求的时候被载入,一旦Servlet被载入,便处于已执行状态。对于以后其他用户的请求,它并不打开进程,而是打开一个线程(Thread),将结果发送给客户。由于线程与线程之间可以通过生成自己的父线程(ParentThread)来实现资源共享,这样就减轻了服务器的负担,所以,JavaServlet可以用来做大规模的应用服务。
老尸 该用户已被删除
沙发
发表于 2015-1-24 07:41:03 | 只看该作者
Asp.net:首先来说,Asp.net和Asp没什么关系,看着像是升级版本什么的,其实没什么联系。Asp是脚本编程,用的是ASP语言,而ASP.net用的是C#语言,完全不同的东西。
爱飞 该用户已被删除
楼主
发表于 2015-1-19 05:59:27 | 只看该作者
现在主流的网站开发语言无外乎asp、php、asp.net、jsp等。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-9-29 11:35

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表