知识大全 如何使用XmlSerializer类控制串行化

Posted 属性

篇首语:人总要找点事情做,让自己忙起来,忙起来才知道生活不易,才明白平时的忧伤都是矫情。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 如何使用XmlSerializer类控制串行化相关的知识,希望对你有一定的参考价值。

如何使用XmlSerializer类控制串行化  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  人们一直高喊XML是解决系统互联问题的关键 而 NET framework 也为处理XML数据提供了许多不同的类库 XmlDocument 类能让你像处理文件一样处理XML 数据 而XmlReader XmlWriter 和它们的派生类使你能够将XML 数据做为数据流处理 XmlSerializer 则提供了另外的方法 它使你能够将自己的对象串行和反串行化为XML 串行化数据既能够让你像处理文件一样对数据进行随机存取 同时又能够跳过你不感兴趣的元素 在本文中 我将向你展示如何使用XmlSerializer类以及如何在你的类中添加属性来控制串行化过程 XmlSerializer    XmlSerializer类存在于System Xml Serialization命名空间的System Xml dll中 它用一种高度松散耦合的方式提供串行化服务 你的类不需要继承特别的基类 而且它们也不需要实现任何特别的接口 相反的 你只需要在你的类或者这些类的公共域以及读/写属性里加上自定义的属性 XmlSerializer 通过相反映射读取这些属性并用它们将你的类和类成员映射到XML元素和属性 将XML 映射到对象考虑表A中的XML语句 哪一个正确的描述了一家电影院中上映的电影呢?表A

<?xml version= encoding= utf ?><theater> <name>The Camelot</name> <phone>( ) </phone> <movie minutes= stars= >  <title>The Score</title>  <rating>R</rating>  <showing> : : </showing>  <showing> : : </showing>  <showing> : : </showing> </movie> <movie minutes= >  <title>Shrek</title>  <rating>PG </rating>  <showing> : : </showing>  <showing> : : </showing>  <showing> : : </showing> </movie></theater>

  表B中定义了一个Theater(电影院)类 它包含了XmlSerializer使用的属性映射 表B

using System;using System Xml Serialization; namespace Articles TechRepublic XmlSerialization    [XmlRoot( theater )]    public class Theater            [XmlElement( name )]        public string Name = ;        [XmlElement( phone )]        public string Phone = ;        [XmlElement( movie )]        public Movie[] Movies;        public override string ToString()                    string movies = ;            if ( Movies != null )                foreach ( Movie movie in Movies )                    movies += + movie ToString();                    return String Format(                     Name Phone movies );         

  XmlRoot 属性将类Theater映射到XML的根元素theater XmlElement 属性将Name Phone 和 Movies数据域映射到嵌套在theater元素中的name phone 和 movie XML元素上去 因为Movies是Movie数组 所以XmlSerializer将它映射到多个XML movie元素 表C展示了一个带有属性映射的Movie类表C

 public class Movie    [XmlElement( title )]    public string Title = ;    [XmlAttribute( minutes )]    public uint Minutes = ;    [XmlElement( showing DataType= time )]    public DateTime[] Showings;    public override string ToString()            string showings = ;        if ( Showings != null )                    showings = shows at ;            foreach ( DateTime showing in Showings )            showings += showing ToShortTimeString() + ;                else                    showings = No showings ;                return String Format( ( min)         Title Minutes showings );     

  XmlElement 属性将Title和Showings数据域映射到movie元素内的title 和showing XML元素 就象 Theater Movie一样 做为DateTime数组的Movie Showings 被映射到多个XML showing 元素 showing 数据域的属性包括位置属性参数DataType= time 它将DateTime值映射到一个XML time值 其间去掉了日期信息而只保留了时间信息 XmlAttribute 属性将Minutes 数据域映射到XML属性而不是XML元素     XML数据中的moviestars(影星)属性和rating(上座率)元素没有被映射到Movie类中的任何东西上去 当反串行化XML数据的时候 XmlSerializer只是简单的跳过它不能映射的项目 当串行化一个对象的时候 你可以在公共数据域和你希望XmlSerializer跳过的属性里加上XmlIgnore 属性     XmlRoot XmlElement 和 XmlAttribute的属性类都应包括后缀 Attribute 在我的属性申明里 我使用了没有后缀的缩写形式 Theater和Movie类中的公共属性可以被改写成公共属性以求得更好的封装性 XmlSerializer 可以用相同的方式使用它们 我在这里将它们做为数据域使用是为了使代码更紧凑 将XML数据反串行化成对象    将XML数据加载到一个Theater对象里现在已经变得非常容易 表D中的程序 XmlIn 通过反串行化movie showings XML 数据创建一个Theater对象 这个程序通过命令行执行 你需要指明一个输入的XML文件 表D

using System;using System Xml Serialization;using System IO;using Articles TechRepublic XmlSerialization;public class XmlIn    public static void Main( string[] args )            if ( args Length != )                    Console WriteLine( Usage: XmlIn infile xml );            return;                try                    // Deserialize the specified file to a Theater object             XmlSerializer xs = new XmlSerializer( typeof ( Theater ) );            FileStream fs = new FileStream( args[ ] FileMode Open );            Theater theater = (Theater)xs Deserialize( fs );            // Display the theater object             Console WriteLine ( theater );                catch ( Exception x )                    Console WriteLine( Exception: + x Message );            Output:>XmlIn theaterIn xmlThe Camelot( ) The Score ( min) shows at : PM : PM : PMShrek ( min) shows at : PM : PM : PM 

  主要的程序代码都放在Main 函数的try代码段里 首先创建一个XmlSerializer对象并指明一个System Type 对象来告诉反串行化程序要创建的对象的类型 typeof操作符为Theater类返回一个System Type 对象 然后 打开一个文件流读取输入的XML文件 调用XmlSerializer的Deserialize方法 并把文件流传递给它 Deserialize 返回对Theater对象的引用 Theater和Movie 对象中的ToString方法能够让你简单的输出它们 将对象串行化到XML里    从一个Theater对象生成XML数据同样是容易的 表E中的程序 XmlOut 就是将一个Theater对象串行化到XML 文件里 这个程序通过命令行执行 你需要指明输出的XML文件 表E

using System;using System Xml;using System Xml Serialization;using System IO;using Articles TechRepublic XmlSerialization;public class XmlOut    // Returns a populated Theater object     public static Theater GetTheater()            Movie movie = new Movie();        movie Title = O Brother Where Art Thou? ;        movie Minutes = ;        movie Showings = new DateTime[ ];        movie Showings[ ] = new DateTime( );        movie Showings[ ] = new DateTime( );        movie Showings[ ] = new DateTime( );        Theater theater = new Theater();        theater Name = Hollywood Movies ;        theater Phone = ( ) ;        theater Movies = new Movie[ ];        theater Movies[ ] = movie;        return theater;        public static void Main( string[] args )            if ( args Length != )                    Console WriteLine( Usage: XmlOut outfile xml );            return;                try                    Theater theater = GetTheater();            // Serialize the Theater object to an XML file             XmlSerializer xs = new XmlSerializer( typeof ( Theater ) );            FileStream fs = new FileStream( args[ ] FileMode Create );            xs Serialize( fs theater );                catch ( Exception x )                    Console WriteLine( Exception: + x Message );            Invocation:>XmlOut theaterOut xmltheaterOut xml contents:<?xml version= ?><theaterxmlns:xsi= instancexmlns:xsd= >    <name>Hollywood Movies </name>    <phone>( ) </phone>    <movie minutes= >        <title>O Brother Where Art Thou?</title>        <showing> : : : </showing>        <showing> : : : </showing>        <showing> : : : </showing>    </movie></theater>  cha138/Article/program/net/201311/11441

相关参考

知识大全 Java swing组件的串行化和读取

Javaswing组件的串行化和读取  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  由于JBut

知识大全 .Net里的哈希表和串行化的简单介绍

.Net里的哈希表和串行化的简单介绍  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  本文介绍了里

知识大全 red hat as 2.1 (linux) 串行控制台配置实例

  阿土(AborigenYin)        这是实例参考《RemoteSerialConsoleHOWTO》()做的  因为只是做串口控制台不需要远程拨入简单些没有在别的环境测试过大家如果有兴趣

知识大全 Java串行端口通讯技术

Java串行端口通讯技术  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  了解串行通讯  串行通讯

知识大全 浅谈Java串行端口技术协议

浅谈Java串行端口技术协议  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  串行通讯慨述  串行

知识大全 串行数据类型

跟我学SQL:串行数据类型  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  SQL的数据类型决定了

知识大全 Java程序性能优化-并行替代串行

Java程序性能优化-并行替代串行  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!   并

知识大全 用VC 6.0实现串行通信的三种方法

用VC6.0实现串行通信的三种方法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!中国科学院王颖  

知识大全 jvm性能调优/垃圾回收器

  :新生代串行收集器(默认收集器)  算法复制算法  XX:+UseSerialGC指定使用新生代串行收集器和老年代串行收集器  优点效率高久经考验  缺点串行如果回收对象过多或者堆过大停顿时间会过

化水系统阀门检修的危险点和控制措施

化水系统阀门检修的危险点和控制措施如下:步骤或活动:高处作业危险点高处物体未做好固定措施(伤害类型:物体打击)控制措施1、戴好安全帽并系紧帽带。2、认真检查作业现场上部有无高空落物的可能,并保持不间断