C# 派生类的XmlSerializer序列化XML

近段对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 Pengju

using 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 



原文地址:https://www.cnblogs.com/qitian1/p/6461993.html