范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

CXML序列化和反序列化(XmlSerializer)

  概述
  XML序列化和反序列化是C#的常用技术,实现的方式有很多种,序列化即将对象转化为便于传输的数据格式, 常见的方法有:二进制,字节数组,json字符串,xml字符串等。 今天主要通过XmlSerializer类的Serialize和Deserialize方法实现. 标注
  如果使用XmlSerializer类实现序列化,不需要用[Serializable]属性标记对象的类型。如果用DataContractSerializer序列化对象,则需要标注[Serializable]或[DataContract]。
  需要序列化的类型前标注 [XmlRoot("Name")],表示根节点;[XmlType(TypeName = "Name")] 节点
  [XmlElement("Name")] 元素[XmlAttribute("Name")] 属性
  [XmlArray] 声明集合
  详见:微软官网:https://learn.microsoft.com/zh-cn/dotnet/standard/serialization/attributes-that-control-xml-serialization
  Mark:
  1. 私有属性不会被序列化;
  2. 标注为[XmlIgnore]的共有属性也不会被序列化;
  3. 枚举类型的属性序列化之前需要赋值 实例 using Caliburn.Micro.Hello.Helper;using Caliburn.Micro.Hello.Models;using System;using System.Collections.Generic;using System.IO;using System.Text;
  namespace Caliburn.Micro.Hello.ViewModels{ public class XmlSerializerViewModel : Screen, IViewModel { private StringBuilder stringBuilder = new StringBuilder(); public string DisplayInfo { get; set; } public XmlSerializerViewModel() { DisplayName = "XmlSerializer";
   xmlFile(); SerializeToXml(); DeserializeXml(); DisplayInfo = stringBuilder.ToString(); }
   public void xmlFile() { XmlFile xmlFile = new XmlFile(); xmlFile.CreateXmlFile("ReviewParams", "maxValue", "30"); }
   public void SerializeToXml() { //测试序列化 var xml = ""; StudentList de = new StudentList();
   var person1 = new Student(); person1.Name = "郭德纲"; person1.Age = 58; person1.Sex = "男";
   var person2 = new Student(); person2.Name = "洪金宝"; person2.Age = 72; person2.Sex = "男";
   de.data = new List(); de.data.Add(person1); de.data.Add(person2);
   xml = XmlHelper.serialize(de); stringBuilder.AppendLine(xml);
   //XmlHelper.SerializeToXml(de); XmlHelper.SerializeToXml(new DocumentDic()); }
   public void DeserializeXml() { var content = File.ReadAllText(Environment.CurrentDirectory + @"myxml.xml"); DocumentDic dee = XmlHelper.deserialize(content, typeof(DocumentDic)) as DocumentDic; if (dee != ) { foreach (var item in dee.dataDic.Values) { stringBuilder.AppendLine(item.Name); } } }
   }}
  
  运行结果:
  这里要注意的是 xtw.Formatting = Formatting.Indented;//可实现换行显示;Dictionary本身不支持序列化,所以需要重写为可序列化的SerializableDictionary;
  SerializeToXml: public static void SerializeToXml(object o) { var type = o.GetType(); if (o == ) { return; }
   //序列化对象 XmlSerializer serializer = new XmlSerializer(type); using (XmlTextWriter xtw = new XmlTextWriter("myxml.xml", Encoding.UTF8)) //用XmlTextWriter 创建一个XML文件 { xtw.Formatting = Formatting.Indented;//可实现换行显示 serializer.Serialize(xtw, o); }; }
  反序化xml为对象: ///  /// 反序化xml为对象 ///  ///  ///  ///  public static object deserialize(string xml, Type type) { try { using (StringReader sr = new StringReader(xml)) { XmlSerializer serializer = new XmlSerializer(type); return serializer.Deserialize(sr); } } catch (Exception e) { return ; } }
  数据模型: //对象定义 [XmlRoot("RecipeData")] //[DataContract(Name = "RecipeData", Namespace = "DataContracts")] [Serializable] public class DocumentDic { public DocumentDic() { dataDic = new SerializableDictionary<string, Student>(); var person = new Student(); person.Name = "韦小宝"; person.Age = 65; person.Sex = "男";
   dataDic.Add("明星", person); } [XmlElement("DataTable")] //DataTable平行出现,不出现data //[XmlIgnore] //[DataMember(Name = "dataDic")] public SerializableDictionary<string, Student> dataDic { get; set; } }
   //对象定义 [XmlRoot("StudentList")] public class StudentList { //[XmlArray("Students"), XmlArrayItem("Student")]  [XmlElement("Students")] public List data { get; set; } }
   [XmlRoot("Student")] public class Student { [XmlElement("Name")] public string Name { get; set; }
   [XmlElement("Age")] public int Age { get; set; }
   [XmlElement("Sex")] public string Sex { get; set; }
   }
  此外还可以用D ataContractSerializer ,  DataContractSerializer 与 XMLSerializer的区别:
  ① 需要序列化对象的所有公共和私有字段和属性,可以使用 DataContractSerializer 而不要使用 XML 序列化。
  ②DataContractSerializer 的性能优于 Xmlserializer。DataContractSerializer 序列化所有标记为 [DataMember] 属性的成员,即使成员标记为私有。 一个类不同时使用[Serializable]和[DataContract]标签。
  源码下载
  链接:https://pan.baidu.com/s/1y1PqmsmHj-roDWv9Pou0LQ
  提取码:6666
  本文参考: 如 有侵权,请联系小编删除!
  1. 【C# XML 序列化】开篇 - https://www.cnblogs.com/cdaniu/p/16093919.html
  2. .NET中XML序列化和反序列化常用类和用来控制XML序列化的属性总结 - https://zhuanlan.zhihu.com/p/487914400

甲流之后并不一定奥司他韦近期,许多孩子得了甲流,随着呼声提高,奥司他韦成了抢手药,其价格也随着水涨船高。可奥司他韦并不是治疗甲流的特效药。首先治疗甲流没有特效药,只能是对症治疗,即孩子出现什么症状,就用对伤人最深的方式,不是争吵,不是拒绝,而是以下6个字电影乱世佳人里,白瑞德对说郝思嘉说我爱你,可你总举着爱的鞭子抽打着我,爱也是会磨灭的。任何人的爱都是有限的,当一个人反复被伤的时候,再热情的人,也会流泪再坚强的心,也会破碎。在感情空就是空,色就是色为了压制欲望,佛曰空即是色,色即是空。可是在现实中能有几个人认同?能有几个人可以做到?不论谁说他可以做到,我都不相信。因为我相信是人就一定有需求,有需求就要寻求满足,寻求满足即是欲我静静地读你读你作者笔下忧思编辑秋枫读你我在书迹中回忆墨香字里行里有你的韵味读你我在蒙蒙细雨中,淋湿了足迹读你我在月下柳荫,听蝉鸣而迷茫读你我在桃花源头,寻觅那陶醉的韵律读你,文字我静静地读你一加精心之作天玑900012GB运行内存5000mAh电池,低至2299元2023年,各大手机厂商的竞争依旧热火朝天,中低端市场上iQOO,红米,真我连续推出全新产品,主打高性价比,大运存,大内存,产品表现也都不错,很难分出胜负。现在一加又加入了这场混战光驱的前生今世为什么光盘还未消失,多数电脑早已取消了光驱?笔点说为什么光盘还未消失,目前的绝大多数电脑早已取消了光驱?大家好,我是笔点酷玩,不知道大家有没有发现一个奇特的现象,那就是光盘还没有消失,可目前大部分的笔记本和台式机的电脑光驱组时隔九年再进8强,脱离了李铁和陈戌源,国足会不会冲上巅峰?北京时间3月9日,中国U20男足在U20亚洲杯D组第三轮的比赛中战平吉尔吉斯斯坦U20男足,以小组第二身份晋级八强,淘汰赛将对阵韩国U20成功冲进8强,这也是中国队时隔九年再次杀入只要你足够强大,所行皆坦途,所见皆笑脸!为什么有些人活得很累,生活过得贫穷,物资缺乏经常遇到些破事好机会都被别人抢走。感觉自己活的悲惨,抱怨老天不公,其实每件事情深究起来,最根本的原因,还是你不够强大!内心过于脆弱,受不数字经济牛市即将拉开大幕,这些AI龙头公司将成为关键推动力!2003年起,成立国资委,央企股改后开始蓬勃发展。2008年,组建住建部,楼市牛市诞生并持续了十年之久。2013年,广电总局的组建,为自媒体热潮开启了大门,并催生了互联网平台的崛起给比亚迪设计师点赞,这外观设计令人惊艳,50万级猎跑SUV来袭跟随新能源汽车的浪潮,国产自主品牌也开始冲击高端,前不久比亚迪就发布了仰望U8U9等豪华车型,如今比亚迪旗下豪华品牌腾势汽车也将发布一款50万级别的SUV腾势N7,从售价来看妥妥面ChatGPT爆火,高中生未来如何选专业?2023年2月15日,中国教育在线执行总编辑任蕾对外经济贸易大学教授王云海与东南大学计算机与软件工程学院教授东南大学认知智能研究所所长漆桂林就不想被ChatGPT取代,未来该如何选
本地游喜看城乡新亮点江苏宿迁市民在京杭大运河畔绿地上搭帐篷放风筝,乐享春日好时光。马海峰摄(人民图片)受多地新冠肺炎疫情变化影响,文化和旅游部在线上举办的第一季度例行发布会上提醒游客,提高自我防护意识游遗址公园,忆京城沧桑历史四月美在祭祖的哀思美在人间的温情让我们一起走进北京的遗址公园回忆京城沧桑的历史吧!01北京皇城根遗址公园午后,皇城根遗址公园广场阳光明媚,老人们坐在长椅上晒太阳,年轻人欢快地打着羽快速创意爆发编辑导语一个创意的爆发可以解决真实的需求,快速创意的爆发更会触发很多新鲜的主意,本篇文章作者分享了有关创意矩阵的知识,感兴趣的一起来看一下吧。小明最近刷手机总能刷到三亚的视频,心里北京野生动物园营业时间调整自2022年3月28日起,北京野生动物园营业时间开始调整营业时间园区运营时间08301730自驾区运营时间09001530售票时间步行区售票时间08301600自驾区售票时间083珀斯一个位于南半球印度洋东岸的红瓦绿树碧海蓝天的城市珀斯是一个小而美的城市,西澳大利亚首府,澳大利亚第四大城市,它被天鹅河(将珀斯郊区分为南北两部分)和印度洋(沿其日落海岸线)所拥抱。珀斯有阳光明媚的天气,美酒,迷人海滩,有很多地方只有春天我们才能在大街上看到满树的鲜花海外春日记一云南紫菀二不等裂马先蒿三开瓣豹子花四单球芹五杜氏马先蒿六苞叶大黄七假百合八针叶龙胆九向日垂头菊十苍山的长柱绣球Hydrangeastylosa星星点点的蓝和惊艳的一抹红在泰国,你只需要花费1000人民币,你能享受到的服务超乎你想象泰国是一个不会让游客失望的国家,每年前往泰国旅行的中国游客高达上千万人次,基本上,每一位游客对泰国的印象非常深刻。(此处已添加小程序,请到今日头条客户端查看)尤其是泰国的人妖表演和英国EA签证延期到月底!原来拿着英签就能玩遍这么多地方4月1日凌晨,英国移民局更新了签证EA政策,又后延了1个月至4月30日。想必这也是受到了最近疫情反复的影响,由于国内现行的严格入境限制检测规定,以及航线通断航班紧缺等原因,目前回国揣1000元人民币去泰国,能请到什么?请一个姑娘已经绰绰有余现如今,出国旅游已经成为了大多数国人们享受生活的一种方式了。在选择出国旅游的时候,我国游客们都会首选到周边国家游玩一番。(此处已添加小程序,请到今日头条客户端查看)因为这些国家除了北京房山姚广孝墓塔北京的房山区有座姚广孝墓塔,是全国重点文物保护单位,那里离戒台寺不远。于是,就趁了一个阳光灿烂的日子,乘车到六里桥转乘321路公交车,乘坐5站,在南宫北站,再换乘964路公交车,2奇观天下面积6666平方公里的班夫公园景致也超6班夫国家公园是加拿大第一个国家公园,设立于1885年,以山湖美景著称。李仁奇摄班夫国家公园历史悠久,是世界上最早的3个国家森林公园之一,其历史可与美国黄石国家森林公园澳大利亚皇家公