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)) { xtw.Formatting = Formatting.Indented; serializer.Serialize(xtw, o); }; }
反序化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")] [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")] public SerializableDictionary<string, Student> dataDic { get; set; } }
[XmlRoot("StudentList")] public class StudentList { [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
本地游喜看城乡新亮点江苏宿迁市民在京杭大运河畔绿地上搭帐篷放风筝,乐享春日好时光。马海峰摄(人民图片)受多地新冠肺炎疫情变化影响,文化和旅游部在线上举办的第一季度例行发布会上提醒游客,提高自我防护意识
游遗址公园,忆京城沧桑历史四月美在祭祖的哀思美在人间的温情让我们一起走进北京的遗址公园回忆京城沧桑的历史吧!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个国家森林公园之一,其历史可与美国黄石国家森林公园澳大利亚皇家公