您的位置:首页 > 编程语言 > C#

C# 派生类的XmlSerializer序列化XML

2013-06-16 17:44 148 查看
近段对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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: