c# XML序列化与反序列化
c# XML序列化与反序列化 原先一直用BinaryFormatter来序列化挺好,可是最近发现在WinCE下是没有办法进行BinaryFormatter操作,很不爽,只能改成了BinaryWriter和BinaryReader来读写,突然想到能不能用XML来序列化?于是在网上查了些资料便写了些实践性代码,做些记录,避免以后忘记。 序列化对象 public class People { [XmlAttribute("NAME")] public string Name { set; get; } [XmlAttribute("AGE")] public int Age { set; get; } } [XmlRoot("Root")] public class Student : People { [XmlElement("CLASS")] public string Class { set; get; } [XmlElement("NUMBER")] public int Number { set; get; } } void Main(string[] args) { Student stu = new Student() { Age = 10, Class = "Class One", Name = "Tom", Number = 1 }; XmlSerializer ser = new XmlSerializer(typeof(Student)); ser.Serialize(File.Create("C:\\x.xml"), stu); } 反序列化对象 XmlSerializer ser = new XmlSerializer(typeof(Student)); Student stu = ser.Deserialize(File.OpenRead("C:\\x.xml")) as Student; 对象数组序列化 public class People { [XmlAttribute("NAME")] public string Name { set; get; } [XmlAttribute("AGE")] public int Age { set; get; } } [XmlRoot("Root")] public class Student : People { [XmlElement("CLASS")] public string Class { set; get; } [XmlElement("NUMBER")] public int Number { set; get; } } void Main(string[] args) { List<Student> stuList = new List<Student>(); stuList.Add(new Student() { Age = 10, Number = 1, Name = "Tom", Class = "Class One" }); stuList.Add(new Student() { Age = 11, Number = 2, Name = "Jay", Class = "Class Two" }); stuList.Add(new Student() { Age = 12, Number = 3, Name = "Pet", Class = "Class One" }); stuList.Add(new Student() { Age = 13, Number = 4, Name = "May", Class = "Class Three" }); stuList.Add(new Student() { Age = 14, Number = 5, Name = "Soy", Class = "Class Two" }); XmlSerializer ser = new XmlSerializer(typeof(List<Student>)); ser.Serialize(File.Create("C:\\x.xml"), stuList); } 对象数组反序列 XmlSerializer ser = new XmlSerializer(typeof(List<Student>)); List<Student> stuList = ser.Deserialize(File.OpenRead("C:\\x.xml")) as List<Student>; foreach (Student s in stuList) { MessageBox.Show(string.Format("{0} : {1} : {2} : {3}", s.Name, s.Age, s.Class, s.Number)); } 序列化Dirctionary public struct DirectionList { [XmlAttribute("Name")] public string Name; [XmlElement("Value")] public int Value; } void Main(string[] args) { Dictionary<string, int> list = new Dictionary<string, int>(); list.Add("1", 100); list.Add("2", 200); list.Add("3", 300); list.Add("4", 400); list.Add("5", 500); list.Add("6", 600); list.Add("7", 700); list.Add("8", 800); list.Add("9", 900); List<DirectionList> dirList = new List<DirectionList>(); foreach (var s in list) { dirList.Add(new DirectionList() { Name = s.Key, Value = s.Value }); } XmlSerializer ser = new XmlSerializer(typeof(List<DirectionList>)); ser.Serialize(File.Create("C:\\x.xml"), dirList); } 这里还要讲一点,在XmlSerializer中,不支持Dirctionary<>类型的对象,所以在序列化这种最常见类型的时候,只能按照它的格式先创建一个可以别序列化的类型,这里我定义了一个结构体,当然你也可以定义成其他的类。将Dictionary<>中的数据依次放进结构体以后就可以放入流中了。 [XmlAttribute("Name")]意思是将这个字段作为xml的属性,属性名跟在“”中 [XmlElement("Value")]意思是将这个字段做为xml的元素。 反序列化Dirctionary XmlSerializer ser = new XmlSerializer(typeof(List<DirectionList>)); List<DirectionList> dirList = ser.Deserialize( File.OpenRead("C:\\x.xml")) as List<DirectionList>; foreach (var v in dirList) { Console.WriteLine("{0} : {1}", v.Name, v.Value); } 其实我并不喜欢这个名称,感觉有点生化危机的feel,但是也就是这样了,没有太炫的地方,Deserialize反序列化。真希望.Net能集成Dirctionary<>对象,那我们这些懒人就方便了。 在需要序列化的队伍中,数组是很常见的类型,其次就是图片了 序列化图片 public struct ImageStruct { [XmlAttribute("Number")] public int number; [XmlElement("Image")] public byte[] picture; } void Main(string[] args) { ImageStruct s = new ImageStruct() { number = 1, picture = File.ReadAllBytes(@"11.jpg") }; XmlSerializer ser = new XmlSerializer(typeof(ImageStruct)); FileStream fs = File.Create("c:\\x.xml"); ser.Serialize(fs, s); fs.Close(); } 一样的,采用结构体来保存图片,这里我还加了个图片的名字,到时候查找起来也方便一些 图片反序列化 XmlSerializer ser = new XmlSerializer(typeof(ImageStruct)); ImageStruct s = (ImageStruct)ser.Deserialize(File.OpenRead("c:\\x.xml")); pictureBox1.Image = Image.FromStream(new MemoryStream(s.picture)); 没有花头的方式,利用memorystream来做缓存,这样会比较快一点,实际上我并没有怎么感觉。 图片数组序列化 public struct ImageStruct { [XmlAttribute("Number")] public int number; [XmlElement("Image")] public byte[] picture; } void Main(string[] args) { List<ImageStruct> imageList = new List<ImageStruct>(); imageList.Add(new ImageStruct() { number = 1, picture = File.ReadAllBytes(@"11.jpg") }); imageList.Add(new ImageStruct() { number = 2, picture = File.ReadAllBytes(@"22.jpg") }); XmlSerializer ser = new XmlSerializer(typeof(List<ImageStruct>)); FileStream fs = File.Create("c:\\x.xml"); ser.Serialize(fs, imageList); fs.Close(); } 图片数组反序列化 XmlSerializer ser = new XmlSerializer(typeof(List<ImageStruct>)); List<ImageStruct> s = (List<ImageStruct>)ser.Deserialize(File.OpenRead("c:\\x.xml")); var im = from i in s where i.number == 1 select i.picture; //var im = s.Where(p => p.number == 1).Select(p => p.picture); foreach (var image in im) { pictureBox1.Image = Image.FromStream(new MemoryStream(image)); } 这里还对数组结构进行了Linq查询,这样就可以很方便的查询图片了。
c# XML序列化与反序列化的更多相关文章
- XML 序列化与反序列化
XML序列化与反序列化 1.将一个类转化为XML文件 /// <summary> /// 对象序列化成XML文件 /// </summary> /// <param na ...
- XmlSerializer 对象的Xml序列化和反序列化
http://www.cnblogs.com/yukaizhao/archive/2011/07/22/xml-serialization.html 这篇随笔对应的.Net命名空间是System.Xm ...
- C#的XML序列化及反序列化
webservice在工作中用到的很多,基本都是以XML格式问通讯内容,其中最关键的就是XML串的序列化及反序列化. XML的运用中有两种信息传递,一种为XML的请求信息,另一种为返回信息,要运用XM ...
- .NET XML序列化与反序列化
闲着没事,写了两个通用的XML序列化与反序列化的方法. 贴出来当作笔记吧! /// <summary> /// XML序列化 /// </summary> /// <ty ...
- XmlSerializer 对象的Xml序列化和反序列化,XMLROOT别名设置
这篇随笔对应的.Net命名空间是System.Xml.Serialization:文中的示例代码需要引用这个命名空间. 为什么要做序列化和反序列化? .Net程序执行时,对象都驻留在内存中:内存中 ...
- Xml序列化、反序列化帮助类
之前从网络上找了一个Xml处理帮助类,并整理了一下,这个帮助类针对Object类型进行序列化和反序列化,而不需要提前定义Xml的结构,把它放在这儿供以后使用 /// <summary> / ...
- Windows phone 之XML序列化与反序列化
为什么要做序列化和反序列化? 一个回答: 我们都知道对象是不能在网络中直接传输的,不过还有补救的办法.XML(Extensible Markup Language)可扩展标记语言,本身就被设计用来存储 ...
- C#操作Xml:XmlSerializer 对象的Xml序列化和反序列化
这篇随笔对应的.Net命名空间是System.Xml.Serialization:文中的示例代码需要引用这个命名空间. 为什么要做序列化和反序列化? .Net程序执行时,对象都驻留在内存中:内存中的对 ...
- C#实现接口xml序列化与反序列化
C#实现接口xml序列化与反序列化 C#中接口无法被xml序列化,提示不支持.百度和bing也搜不到,只好自己动手写了 原理上肯定支持,.Net自己的xml序列化有一个IXmlSerializab ...
随机推荐
- ElasticSearch + Kibana
关键词: 数据可视化 数据分析 数据爬虫 信息检索(搜索引擎) ElasticSearch是基于Lucene的分布式搜索引擎,提供多种插件及配套工具. 其中Kibana可以“关联”ES中的数据集,进行 ...
- LeetCode:Longest Substring Without Repeating Characters(最长不重复子串)
题目链接 Given a string, find the length of the longest substring without repeating characters. For exam ...
- [leetcode]Maximum Product Subarray @ Python
原题地址:https://oj.leetcode.com/problems/maximum-product-subarray/ 解题思路:主要需要考虑负负得正这种情况,比如之前的最小值是一个负数,再乘 ...
- Angular学习笔记--last_update 20151106
参考来源:http://www.angularjs.cn/tag/AngularJS?p=1&s=50 基本要求:一周搞定33篇学习文章 目标:develop/refactor lms系统an ...
- Linux文件系统性能优化 (转)
http://blog.chinaunix.net/uid-7530389-id-2050116.html 由于各种的I/O负载情形各异,Linux系统中文件系统的缺省配置一般来说都比较中庸,强调普遍 ...
- vim 多行注释消除注释,多行删除
进入可视化模式: Ctrl+v 继续进入编辑模式: shift+i 注释: shift+# 注释生效: ESC 取消注释 d 删除 选中全部字符块区域,使用方向键上下右: 然后,按一下d
- db2 ha create dependency failed 解决
db2diag.log 2014-10-16-23.27.55.009490-240 E31979E444 LEVEL: ErrorPID : 6651 TID : 140508206864160 P ...
- 无法import的原因(ImportError: No module named *****)
python中,每个py文件被称之为模块,每个具有__init__.py文件的目录被称为包.只要模块或者包所在的目录在sys.path中,就可以使用import 模块或import 包来使用. 如果想 ...
- arcgis flexviewer中由Application向widget传值
arcgis flexviewer所有的小部件类均继承自com.esri.viewer.BaseWidget基类,而BaseWidget又继承了com.esri.viewer.IBaseWidget接 ...
- D3 & Data Visualization in Ext JS
通过适配器可以在ExtJs中轻松的集成D3的展示能力 http://video.sencha.com/watch/zvUjnFJ91xVvuwdTh2zjqP?mkt_tok=eyJpIjoiWm1a ...