XML的序列化和反序列化

问题描述

我程序里要用到几种自定义的对象,一共是9个对象。每一个对象有不同的属性(我把它定义成结构体了)。其中对象1的属性是结构体LEDWindowsAttribute对象2、对象3的属性是结构体TextWindowsAttribute对象4、对象5、对象6、对象7、对象8、对象9的属性是结构体TimeWindowsAttribute对象1是父节点(只有一个)对象2------对象8是子节点。我通过程序上的按钮操作动态的增加或删除子节点(用TreeView显示父节点和子节点,子节点里有重复对象比如有3个对象2,且子节点数量可能很多)。我怎么才能将节点关系及对象属性序列化并存储成XML格式的文件,怎么反序列化XML文件解析还原得到TreeView上的树状结构和各个节点的属性。希望大神能给出代码或思路。TreeView上的表现形式如下所示对象1的NodeText值|----对象2的NodeText值|----对象3的NodeText值|----对象4的NodeText值|----对象5的NodeText值|----对象2的NodeText值|----对象6的NodeText值|----对象3的NodeText值。。。。。。以下是我定义的几个对象属性//////单行文字和多行文字对象窗口的属性///publicstructTextWindowsAttribute{[XmlAttribute("NodeName")]publicstringNodeName;//节点名字[XmlElement("NodeText")]publicstringNodeText;//节点文本[XmlElement("NodeIndex")]publicintNodeIndex;//节点序号[XmlElement("X")]publicintX;//X坐标[XmlElement("Y")]publicintY;//Y坐标[XmlElement("Width")]publicintWidth;//宽度[XmlElement("Height")]publicintHeight;//高度[XmlElement("Text")]publicstringText;//文字[XmlElement("FontName")]publicstringFontName;//字体[XmlElement("FontSize")]publicfloatFontSize;//字号[XmlElement("FontBold")]publicboolFontBold;//是否粗体[XmlElement("FontItalic")]publicboolFontItalic;//是否斜体[XmlElement("FontUnderline")]publicboolFontUnderline;//是否有下划线[XmlElement("FontColor")]publicintFontColor;//文字颜色}//////时间对象窗口的属性///publicstructTimeWindowsAttribute{[XmlAttribute("NodeName")]publicstringNodeName;//节点名字[XmlElement("NodeText")]publicstringNodeText;//节点文本[XmlElement("NodeIndex")]publicintNodeIndex;//节点序号[XmlElement("X")]publicintX;//X坐标[XmlElement("Y")]publicintY;//Y坐标[XmlElement("Width")]publicintWidth;//宽度[XmlElement("Height")]publicintHeight;//高度[XmlElement("FontName")]publicstringFontName;//字体[XmlElement("FontSize")]publicfloatFontSize;//字号[XmlElement("FontBold")]publicboolFontBold;//是否粗体[XmlElement("FontItalic")]publicboolFontItalic;//是否斜体[XmlElement("FontUnderline")]publicboolFontUnderline;//是否有下划线[XmlElement("FontColor")]publicintFontColor;//文字颜色}//////LED显示屏对象窗口的属性///publicstructLEDWindowsAttribute{[XmlAttribute("NodeName")]publicstringNodeName;//节点名字[XmlElement("NodeText")]publicstringNodeText;//节点文本[XmlElement("NodeIndex")]publicintNodeIndex;//节点序号[XmlElement("X")]publicintX;//X坐标[XmlElement("Y")]publicintY;//Y坐标[XmlElement("Width")]publicintWidth;//宽度[XmlElement("Height")]publicintHeight;//高度}

解决方案

解决方案二:

解决方案三:
[Flags]publicenumNodeFontStyle{Regular=0,Bold=1,Italic=2,Underline=4,All=Bold|Italic|Underline,}[Serializable]publicstructNodeRect{[XmlAttribute("x")]publicintX{get;set;}[XmlAttribute("y")]publicintY{get;set;}[XmlAttribute("width")]publicintWidth{get;set;}[XmlAttribute("height")]publicintHeight{get;set;}publicNodeRect(intx,inty,intwidth,intheight){X=x;Y=y;Width=width;Height=height;}}[Serializable]publicclassNodeFont{[XmlAttribute("name")]publicstringName{get;set;}[XmlAttribute("size")]publicfloatSize{get;set;}[XmlElement("color")]publicSystem.Drawing.ColorColor{get;set;}[XmlAttribute("style")]publicSystem.Drawing.FontStyleStyle{get;set;}staticNodeFont_Default;publicstaticNodeFontDefault{get{return_Default;}}staticNodeFont(){_Default=newNodeFont(){Name=System.Drawing.SystemFonts.DefaultFont.Name,Size=System.Drawing.SystemFonts.DefaultFont.Size,Color=System.Drawing.SystemColors.ControlText,Style=System.Drawing.FontStyle.Regular,};}}[Serializable][XmlInclude(typeof(LedNode))][XmlInclude(typeof(TimeNode))][XmlInclude(typeof(TextNode))]publicabstractclassNodeBase{[XmlAttribute("name")]publicstringName{get;set;}[XmlAttribute("text")]publicstringText{get;set;}[XmlAttribute("index")]publicintIndex{get;set;}[XmlElement("rect")]publicNodeRectRect{get;set;}NodeBase_Parent;publicNodeBaseParent{get{return_Parent;}}List<NodeBase>_Children;[XmlArray("nodes")][XmlArrayItem("node")]publicList<NodeBase>Children{get{return_Children;}}publicNodeBase(){_Children=newList<NodeBase>();_Parent=null;}publicvoidSetParent<T>(Tparent)whereT:NodeBase{_Parent=parent;}}[Serializable][XmlType("led")]publicclassLedNode:NodeBase{publicstaticreadonlyNodeRectDefaultRect;staticLedNode(){DefaultRect=newNodeRect(0,0,300,90);}publicLedNode(){Rect=DefaultRect;}}[Serializable][XmlType("time")]publicclassTimeNode:LedNode{publicnewstaticreadonlyNodeRectDefaultRect;[XmlElement("font")]publicNodeFontFont{get;set;}staticTimeNode(){DefaultRect=newNodeRect(0,0,100,80);}publicTimeNode(){Font=NodeFont.Default;}}[Serializable][XmlType("text")]publicclassTextNode:TimeNode{publicstaticnewreadonlyNodeRectDefaultRect;[XmlAttribute("caption")]publicstringCaption{get;set;}staticTextNode(){DefaultRect=newNodeRect(0,0,200,80);}publicTextNode(){Font=NodeFont.Default;}}publicstaticclassNodeStaticExtension{publicstaticstringSerialize<T>(thisTnode)whereT:NodeBase{varsettings=newXmlWriterSettings{Encoding=Encoding.Default,Indent=true,OmitXmlDeclaration=true,};varns=newXmlSerializerNamespaces();ns.Add(string.Empty,string.Empty);varsb=newStringBuilder();using(varwriter=XmlWriter.Create(sb,settings)){varserializer=newXmlSerializerFactory().CreateSerializer(typeof(T));serializer.Serialize(writer,node,ns);}returnsb.ToString();}}publicstaticclassNodeFactory{publicstaticTCreate<T>(stringname,stringtext,intindex)whereT:NodeBase{varresult=Activator.CreateInstance<T>();result.Name=name;result.Text=text;result.Index=index;returnresult;}publicstaticTCreate<T>(stringname,stringtext,intindex,stringcaption)whereT:TextNode{varresult=Create<T>(name,text,index);result.Caption=caption;returnresult;}publicstaticTCreate<T>(stringname,stringtext,intindex,NodeBaseparent)whereT:NodeBase{varresult=Create<T>(name,text,index);result.SetParent(parent);returnresult;}publicstaticTCreate<T>(stringname,stringtext,intindex,stringcaption,NodeBaseparent)whereT:TextNode{varresult=Create<T>(name,text,index);result.Caption=caption;returnresult;}publicstaticTCreate<T>(stringname,stringtext,intindex,NodeBaseparent,IEnumerable<T>children)whereT:NodeBase{varresult=Create<T>(name,text,index);result.SetParent(parent);result.Children.AddRange(children);returnresult;}publicstaticTCreate<T>(stringname,stringtext,intindex,stringcaption,NodeBaseparent,IEnumerable<T>children)whereT:TextNode{varresult=Create<T>(name,text,index);result.Caption=caption;result.SetParent(parent);result.Children.AddRange(children);returnresult;}publicstaticTCreate<T>(stringxml)whereT:NodeBase{varresult=default(T);varserializer=newXmlSerializerFactory().CreateSerializer(typeof(T));using(varsr=newSystem.IO.StringReader(xml)){using(varxr=XmlReader.Create(sr)){if(serializer.CanDeserialize(xr)){result=serializer.Deserialize(xr)asT;}}}returnresult;}}

解决方案四:
调用方法,box是一个textbox至于如何加载到treeview就靠你自己了varroot=NodeFactory.Create<LedNode>("LED","LED",0);for(inti=0;i<8;i++){vars=string.Format("Text{0}",i+1);varchild=NodeFactory.Create<TextNode>(s,s,i,s,root);if(i%3==0){child.Font.Color=System.Drawing.Color.Red;child.Font.Style=System.Drawing.FontStyle.Bold|System.Drawing.FontStyle.Underline;}root.Children.Add(NodeFactory.Create<TextNode>(s,s,i,s,root));}for(inti=0;i<3;i++){vars=string.Format("Time{0}",i+1);varchild=NodeFactory.Create<TimeNode>(s,s,i,root);if(i==2){child.Font.Color=System.Drawing.Color.Blue;child.Font.Style=System.Drawing.FontStyle.Bold|System.Drawing.FontStyle.Italic;}root.Children.Add(child);}varxml=root.Serialize();box.AppendText(xml);varnode=NodeFactory.Create<LedNode>(xml);foreach(varchildinnode.Children){box.AppendText(string.Format("{0}:{1}rn",child.GetType(),child.Name));}

时间: 2024-10-22 12:52:31

XML的序列化和反序列化的相关文章

windows phone8.1:Xml,Json序列化和反序列化

原文:windows phone8.1:Xml,Json序列化和反序列化 小梦本例主要实现以下四点内容: 将Car对象序列化为xml 将Car对象序列化为Json 将xml反序列化为Car对象 将json反序列化为json对象 Car类如下: [task]public class Car{public int Id { get; set; }public string Make { get; set; }public string Model { get; set; }public int Ye

C#实现对象的Xml格式序列化及反序列化

xml|对象   要序列化的对象的类: [Serializable]public class Person{private string name;public string Name{get{return name;}set{name=value;}}public string Sex;public int Age=31;public Course[] Courses; public Person(){}public Person(string Name){name=Name;Sex="男&q

jackson (json、xml的序列化与反序列化)

jackson用于java对象到json的序列化与反序列化.还支持xml格式. jackson用于实现json与java对象的序列与反序列化.web service要实现跨机器传送对象那么就需要有一种技术能把对象转换为特定格式的信息.为了实现跨平台(比如把java对象转化为c#或c++对象),又考虑到方便人们阅读,所以基于字符串规则的转换是最理想的.json就是这样一个轻量级的数据交换格式,而jackson是一个实现该功能的很好用的框架. 1.获得 <dependency> <group

List&lt;T&gt;到XML的序列化与反序列化

原文 http://hi.baidu.com/shishengli1234/item/f0536f36335390c22f8ec24b Model.RESE_SCH sch1 = new Model.RESE_SCH(); sch1.CLINIC_TIME = DateTime.Now.AddDays(1); sch1.EXPERT_NO = "1"; sch1.REG_TYPE = "1"; sch1.RSRC_ID = "1"; sch1.S

C# XML和JSON 序列化与反序列化

1.JSON的序列化与反序列化     JSON(JavaScript Object Notation)是一种轻量级的数据交换语言,它虽然是JavaScript的一个子集,但它是独立于语言的文本格式.它的数据格式比较简单,易于读写,且都是压缩的,占用带宽小且易于解析,通常会用JSON格式来传输数据或者用于数据存储.有关JSON数据结构语法的更多知识大家可以在网上其它的地方进行了解,我们只要记住在服务端向客户端传输数据时经常使用它,然后对它的序列化和反序列化非常值得了解就ok了.序列化的过程就是把

重新想象 Windows 8 Store Apps (60) - 通信: 获取网络信息, 序列化和反序列化

原文:重新想象 Windows 8 Store Apps (60) - 通信: 获取网络信息, 序列化和反序列化 [源码下载] 重新想象 Windows 8 Store Apps (60) - 通信: 获取网络信息, 序列化和反序列化 作者:webabcd 介绍重新想象 Windows 8 Store Apps 之 通信 获取网络信息 序列化 - json 序列化 - xml 序列化 - rss atom 示例1.演示如何获取网络的相关信息Communication/NetworkInfo.xa

.Net中的序列化和反序列化详解_实用技巧

序列化和反序列化相信大家都经常听到,也都会用, 然而有些人可能不知道:.net为什么要有这个东西以及.net Frameword如何为我们实现这样的机制, 在这里我也是简单谈谈我对序列化和反序列化的一些理解. 一.什么序列化和反序列化序列化通俗地讲就是将一个对象转换成一个字节流的过程,这样就可以轻松保存在磁盘文件或数据库中.反序列化是序列化的逆过程,就是将一个字节流转换回原来的对象的过程. 然而为什么需要序列化和反序列化这样的机制呢?这个问题也就涉及到序列化和反序列化的用途了, 对于序列化的主要

对象的序列化与反序列化,以xml,二进制流的方式,soap方式序列化对象

  System.Runtime.Serialization.Formatters.Soap 命名空间包含SoapFormatter 类,该类用于以SOAP 格式将对象序列化和反序列化.生成使用此命名空间中的类型的应用程序时,必须引用System.Runtime.Serialization.Formatters.Soap.dll 程序集.   using System;using System.Drawing;using System.Collections;using System.Windo

.NET对象的XML序列化和反序列化

 序列化的概念 序列化是指一个对象的实例可以被保存,保存成一个二进制串,当然,一旦被保存成二进制串,那么也可以保存成文本串了.比如,一个计数器,数值为2,我们可以用字符串"2"表示.如果有个对象,叫做connter,当前值为2,那么可以序列化成"2",反向的,也可以从"2"得到值为2的计数器实例.这样,关机时序列化它,开机时反序列化它,每次开机都是延续的.不会都是从头开始. 序列化概念的提出和实现,可以使我们的应用程序的设置信息保存和读取更加方便