C# XML反序列化问题
以下是我的xml文档,实体类,和我的代码,我现在想把xml文档反序列化成实体类并保证得到的的实体序列化后和这个xml一致...
以下是我的xml文档,实体类,和我的代码,我现在想把xml文档反序列化成实体类并保证得到的的实体序列化后和这个xml一致
展开
1个回答
展开全部
XML自定义序列化,
xml自定义序列化有三种办法,从简单的说起:特性化xml自定义序列化。
在类上加[XmlSerialization]或[Serialization]表示其实现序列化。
在其属性上加[XmlElement()]来自定义将属性序列化成指定的名称,当然XmlElelment是序列化成元素,如果要序列化成属性的化是XmlAttribute。等等,将这个些写完后即可实现。
告诉你一个好的消息是,它不但支持xmlElement,也支持DataMember的方式!这种序列化的方式是自由度较低的一种方式。但足够平时的使用了。
第二种方式是实现序列化接口,IXmlSerializa,该接口中有两个方法序列化与反序列化,可以实现具体的序列化,该种情况常用来解决针对Dictionary之类的属性,由于其序列化可能达到我们具体的文件要求,所以可以直接拿这些东西开刀。所以自由度较高。
第二种还有一个附加方式,使用序列化方案。通过注入的方式,但原理与此相同,它是要你写一个ISerializeFormat继承下来的序列化容器。这种方案可用于对多个近似对象进行序列化,第二种方式很明显,一个类要写一个接口,但是如果大多数的情况下,很多个类时,我们会重复写接口的实现内容。此时对于我们代码维护或管理时很不利的。所以把序列化方式集中起来写成一个容器。然后进行集中的序列化,这样多个类可以使用一个序列化的容器,不必要每个都实现一个IXmlSerializa的接口了。而这种方式在序列化或反序列时通过容器实现对一系列类的序列化。
第三种方式:XML文档处理,其实这是最笨的一种做法了,有时只是为了快速测试某个项目或其他的特别的目的,把对象加载进来,通过反射对象的方式,自己组织xml结构。比如加个什么node之类的,然后node中再加什么node等等,基本上是完全脱离了序列化的内容,只是利用xmldocument方式机械地组织对象的存储方式。其实xmldocument只是用来处理xml文档,与序列化已经没有关系了——只不过我们序列化时也会用到它做为基础而已,比如第二种方式的两种方法中都使用了xmlwriter就是封装了一个xmldocument而已。但这个没有必要具体的展现,所以轻松很多。
当然,还有人说直接写文本,连xmldocument都不用,直接自己生成一串的标签自己写,那么这与xml文档处理其实是一样的,好呆序列成xml使用了xmldocument还算是能再节省一点力气的,直接用写文本,那你愿意用就用吧,反正它是写文件的,其实xmldocument就是对一个文本流进行封装而已,你如果愿意,写这个也没问题,但对于序列化来说,它离序列化就更远了!
举个例子你能明白,你每次写文本都要先写个<?xml dtd ?>的,那么能不写成一个方法呢?好吧,我们可以封装一下,比如封闭成一个xmlwriter("DTD","版本号“);这个方法可以直接写成DTD,至少不会让你的xml标签不配对,嗯,是这样,那么写其他的元素和标签呢?都各自己封装与一个方法吧,方便不是?
对的,是很方便,这就是xmldocument!(只是原理如此)
每个对象都有一个属性,我们能不能通过反射的方式反射出其属性,然后把它的属性值写成xml的一个文件中呢?可以,这就是IXmlSerialize接口要求你实现的东西,不过提前把xmlwriter给你调用进来让你用。没错,这就是接口方式或容器注入的方式。
那么,如果我对对象序列化要求不大,实现简单的元素名称修改或是控制生成元素还是属性呢?嗯,这就是特性化的方式,其实其内容机理也是注入的方式,如此而已。
所以如果特性化注入达不到你的要求时,可以考虑使用接口或直接写序列化容器就可以了。至于第三种写文件,那已经超出序列化的范围了,相当于你自己在实现序列化,当然了,你序列化二进制还是xml还是json都看你自己了。只不过是用xmldocument还是二进制而已。(事实上ISerializaFormat本身就可以实现这几种方式的序列化)。
上文中提示支持Datamember的情况,其实这种是Soap协议用到的,此处实现的是Soap协议体的部分,因为Soap也是xml协议,所以DataMember被支持的原因就在这里,如果是单纯序列化的话,那么XMLSerialize才是真正序列化成xml的。很多人分不清这里的区别,Soap协议包含封套(头)和体两部分,而此处是用来序列化体的(MessageBody),所以生成的也是xml,并不会生成头。而要自定Soap封套时,则使用的是SoapMessage注入的方式进行组合。但要序列化的结构或类仍可以被借用来生成xml。而XmlSerialize才是真正的序列化成xml。便不幸的是,针对数组或是集合类型,它有时会多出一重包含,这是我们不需要的或是不想要的,这种情况下,我们可以使用第二种方案。JSON中存在一个开关,对集合类型是否包含集合是可以选择的。这一节问题你可能在以后中会用到。
xml自定义序列化有三种办法,从简单的说起:特性化xml自定义序列化。
在类上加[XmlSerialization]或[Serialization]表示其实现序列化。
在其属性上加[XmlElement()]来自定义将属性序列化成指定的名称,当然XmlElelment是序列化成元素,如果要序列化成属性的化是XmlAttribute。等等,将这个些写完后即可实现。
告诉你一个好的消息是,它不但支持xmlElement,也支持DataMember的方式!这种序列化的方式是自由度较低的一种方式。但足够平时的使用了。
第二种方式是实现序列化接口,IXmlSerializa,该接口中有两个方法序列化与反序列化,可以实现具体的序列化,该种情况常用来解决针对Dictionary之类的属性,由于其序列化可能达到我们具体的文件要求,所以可以直接拿这些东西开刀。所以自由度较高。
第二种还有一个附加方式,使用序列化方案。通过注入的方式,但原理与此相同,它是要你写一个ISerializeFormat继承下来的序列化容器。这种方案可用于对多个近似对象进行序列化,第二种方式很明显,一个类要写一个接口,但是如果大多数的情况下,很多个类时,我们会重复写接口的实现内容。此时对于我们代码维护或管理时很不利的。所以把序列化方式集中起来写成一个容器。然后进行集中的序列化,这样多个类可以使用一个序列化的容器,不必要每个都实现一个IXmlSerializa的接口了。而这种方式在序列化或反序列时通过容器实现对一系列类的序列化。
第三种方式:XML文档处理,其实这是最笨的一种做法了,有时只是为了快速测试某个项目或其他的特别的目的,把对象加载进来,通过反射对象的方式,自己组织xml结构。比如加个什么node之类的,然后node中再加什么node等等,基本上是完全脱离了序列化的内容,只是利用xmldocument方式机械地组织对象的存储方式。其实xmldocument只是用来处理xml文档,与序列化已经没有关系了——只不过我们序列化时也会用到它做为基础而已,比如第二种方式的两种方法中都使用了xmlwriter就是封装了一个xmldocument而已。但这个没有必要具体的展现,所以轻松很多。
当然,还有人说直接写文本,连xmldocument都不用,直接自己生成一串的标签自己写,那么这与xml文档处理其实是一样的,好呆序列成xml使用了xmldocument还算是能再节省一点力气的,直接用写文本,那你愿意用就用吧,反正它是写文件的,其实xmldocument就是对一个文本流进行封装而已,你如果愿意,写这个也没问题,但对于序列化来说,它离序列化就更远了!
举个例子你能明白,你每次写文本都要先写个<?xml dtd ?>的,那么能不写成一个方法呢?好吧,我们可以封装一下,比如封闭成一个xmlwriter("DTD","版本号“);这个方法可以直接写成DTD,至少不会让你的xml标签不配对,嗯,是这样,那么写其他的元素和标签呢?都各自己封装与一个方法吧,方便不是?
对的,是很方便,这就是xmldocument!(只是原理如此)
每个对象都有一个属性,我们能不能通过反射的方式反射出其属性,然后把它的属性值写成xml的一个文件中呢?可以,这就是IXmlSerialize接口要求你实现的东西,不过提前把xmlwriter给你调用进来让你用。没错,这就是接口方式或容器注入的方式。
那么,如果我对对象序列化要求不大,实现简单的元素名称修改或是控制生成元素还是属性呢?嗯,这就是特性化的方式,其实其内容机理也是注入的方式,如此而已。
所以如果特性化注入达不到你的要求时,可以考虑使用接口或直接写序列化容器就可以了。至于第三种写文件,那已经超出序列化的范围了,相当于你自己在实现序列化,当然了,你序列化二进制还是xml还是json都看你自己了。只不过是用xmldocument还是二进制而已。(事实上ISerializaFormat本身就可以实现这几种方式的序列化)。
上文中提示支持Datamember的情况,其实这种是Soap协议用到的,此处实现的是Soap协议体的部分,因为Soap也是xml协议,所以DataMember被支持的原因就在这里,如果是单纯序列化的话,那么XMLSerialize才是真正序列化成xml的。很多人分不清这里的区别,Soap协议包含封套(头)和体两部分,而此处是用来序列化体的(MessageBody),所以生成的也是xml,并不会生成头。而要自定Soap封套时,则使用的是SoapMessage注入的方式进行组合。但要序列化的结构或类仍可以被借用来生成xml。而XmlSerialize才是真正的序列化成xml。便不幸的是,针对数组或是集合类型,它有时会多出一重包含,这是我们不需要的或是不想要的,这种情况下,我们可以使用第二种方案。JSON中存在一个开关,对集合类型是否包含集合是可以选择的。这一节问题你可能在以后中会用到。
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询