C# 派生类的XmlSerializer序列化XML

来源:互联网 发布:淘宝卖家论坛哪个好 编辑:程序博客网 时间:2024/05/23 11:51

近段对XML 序列化进行处理,用XmlSerializer这个挺好用的。

但是对于派生类对象的XML的生成总会报错。因为同一个节点名称,不能反射为不同的对象。这个在网上找了好久,都说要利用反射来处理。

现在用XML的类似C++ 函数前置声明。 XmlInclude 来实现。

声明:新手新学,难免纰漏!

直接代码。

环境: Vs2008 C#

1. 建了一个新C# 控制台工程。

主要要添加引用 

using System.Xml;using System.Xml.Serialization;

2. 声明和定义XML的生成对象格式。

  自己写了个FormatDefine.cs类,用来实现定义对象的格式。

using System;using System.Collections.Generic;using System.Linq;using System.Text;// Zhang Pengjuusing System.Xml;using System.Xml.Serialization;//namespace SerializeTest{    public class StyleNote    {        [XmlText]        public string StyleNoteNode { get; set; }    }    [XmlInclude(typeof(PointStyle))]    [XmlInclude(typeof(LineStyle))]    public class Style    {        [XmlAttribute("id")]        public int id { get; set; }        [XmlAttribute("type")]        public string TypeNode { get; set; }        //         public string StyleType { get; set; }    }    // 线的STYLE    public class LineStyle : Style    {        [XmlElement("Line")]        public string LineNode { get; set; }        [XmlElement("Count")]        public int CountNode { get; set; }    }    // 点的STYLE    public class PointStyle : Style    {        [XmlElement("Point")]        public string PointNode { get; set; }    }    //    public class Styles    {        [XmlElement(ElementName = "Style")]        public List<Style> StyleListNode { get; set; }        public Styles()        {            StyleListNode = new List<Style>();        }    }    // 根节点    [XmlRoot("root")]    public class TestRoot    {        [XmlElement("Title")]        public StyleNote rStyleNote;        [XmlElement("Styles")]        public Styles StylesSNode { get; set; }    }}

3. 调用和使用。

在Program.cs中测试。

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Xml;using System.Xml.Serialization;using System.IO;namespace SerializeTest{    class Program    {        static void Main(string[] args)        {            TestRoot oTestRoot = new TestRoot();            // StyleNote            StyleNote oStyleNote = new StyleNote();            oStyleNote.StyleNoteNode = "this is just a test";            // 线            LineStyle oLineStyle = new LineStyle();            oLineStyle.id = 1;            oLineStyle.StyleType = "StyleTypeLine";            oLineStyle.TypeNode = "TypeNodeLine";            oLineStyle.LineNode = "线节点";            oLineStyle.CountNode = 10;            // 点            PointStyle oPointStyle = new PointStyle();            oPointStyle.id = 2;            oPointStyle.StyleType = "StyleTypePoint";            oPointStyle.TypeNode = "TypeNodePoint";            oPointStyle.PointNode = "点节点";                        //            Styles oStyles = new Styles();            oStyles.StyleListNode.Add(oPointStyle);            oStyles.StyleListNode.Add(oLineStyle);            // 添加到root中            oTestRoot.rStyleNote = oStyleNote;            oTestRoot.StylesSNode = oStyles;            // 保存文件名称            string oFileName = "C:\\my_Test.xml";            System.Xml.Serialization.XmlSerializer serializer = null;            System.IO.StreamWriter writer = null;            try            {                   serializer = new System.Xml.Serialization.XmlSerializer(oTestRoot.GetType());                FileStream fs = new FileStream(oFileName, FileMode.Create);                serializer.Serialize(fs,oTestRoot);            }            catch (System.Exception ex)            {            }            finally            {                if (writer != null)                {                    writer.Close();                }            }        }    }}


这样运行,基本搞定。

生成XML如下:


<?xml version="1.0"?><root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">  <Title>this is just a test</Title>  <Styles>    <Style xsi:type="PointStyle" id="1" type="TypeNodePoint">      <StyleType>StyleTypePoint</StyleType>      <Point>点节点</Point>    </Style>    <Style xsi:type="LineStyle" id="1" type="TypeNodeLine">      <StyleType>StyleTypeLine</StyleType>      <Line>线节点</Line>      <Count>10</Count>    </Style>  </Styles></root>

至此,没有了。

欢迎留言,讨论!求进步!


留源码下载地址:http://download.csdn.net/detail/cartzhang/5591659