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

C# 派生类的XmlSerializer序列化XML的更多相关文章

  1. .NET(C#):XML序列化时派生类的处理

    原文 www.cnblogs.com/mgen/archive/2011/12/03/2275014.html 目录 1. 针对基类的XmlSerializer序列化派生类 2. 类内成员是派生类的序 ...

  2. c# XML和实体类之间相互转换(序列化和反序列化)[砖]

    link: http://blog.okbase.net/haobao/archive/62.html by: 好饱 我们需要在XML与实体类,DataTable,List之间进行转换,下面是XmlU ...

  3. C# XML和实体类之间相互转换(序列化和反序列化)

    我们需要在XML与实体类,DataTable,List之间进行转换,下面是XmlUtil类,该类来自网络并稍加修改. using System; using System.Collections.Ge ...

  4. XML和实体类之间相互转换(序列化和反序列化)

    我们需要在XML与实体类,DataTable,List之间进行转换,下面是XmlUtil类,该类来自网络并稍加修改. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...

  5. C#中将xml文件反序列化为实例时采用基类还是派生类的问题

    基类: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ...

  6. 六、用DataContractSerialize类序列化XML

    一.层次结构 基类:XmlObjectSerializer 派生类: DataContractSerializer NetDataContractSerializer DataContractJson ...

  7. .NET调用外部接口将得到的List数据,并使用XmlSerializer序列化List对象成XML格式

    BidOpeningData.BidSupervisionSoapClient client = new BidOpeningData.BidSupervisionSoapClient(); Dict ...

  8. 基类,派生类,内存分配情况 .xml

    pre{ line-height:1; color:#1e1e1e; background-color:#d2d2d2; font-size:16px;}.sysFunc{color:#627cf6; ...

  9. C#语言中的XmlSerializer类的XmlSerializer.Serialize(Stream,Object)方法举例详解

    在对象和 XML 文档之间进行序列化和反序列化操作. XmlSerializer 使您能够控制如何将对象编码为 XML. 命名空间:   System.Xml.Serialization程序集:  S ...

随机推荐

  1. LuoguP4462 [CQOI2018]异或序列

    https://zybuluo.com/ysner/note/1124952 题面 给你一个大小为\(n\)的序列,然后给你一个数字\(k\),再给出\(m\)组询问,询问给出一个区间,问这个区间里面 ...

  2. TS流解析 四

    一 从TS流开始 数字电视机顶盒接收到的是一段段的码流,我们称之为TS(Transport Stream,传输流),每个TS流都携带一些信息,如Video.Audio以及我们需要学习的PAT.PMT等 ...

  3. 面向对象软件工程与UML

    软件工程基本概念 软件危机 软件的功能.规模及复杂性与日俱增,软件的复杂性达到了它的开发者难以控制的程度 这种情况导致了严重的后果: 软件可靠性下降 开发效率低下 维护极为困难 这使软件开发者陷入困境 ...

  4. 查看mysql是否安装成功和mysql的版本信息

    转自:https://blog.csdn.net/hellocsz/article/details/81241204 使用快捷键win+R打开 进入mysql的安装目录下的\bin(本人安装路劲为E: ...

  5. Mybatis 代码自动生成(generatorConfig.xml配置)

    博客推荐: Mybatis最入门---代码自动生成(generatorConfig.xml配置) MyBatis Generator generatorConfig.xml配置详解 pom.xml&l ...

  6. Django - 自定义请求头

    收藏一下以后学习 博客搬运地址 Django接收自定义http header(转)

  7. E20171006-hm

    trace  vt. 跟踪,追踪; 追溯,探索; 探索; 查找;          vi. 沿着一小径或道路前进; 可以追溯的;            n. 痕迹; 痕迹,踪迹; 微量,极少量; [植 ...

  8. web自动化测试—selenium游览器下拉框操作

    # coding=utf-8'''下拉框实战思路导包:from selenium.webdriver.support.select import Select #下拉框select from sele ...

  9. scrapy安装及基本使用

    前端html, css, js 相关知识 数据库运用 http协议的了解 前后台联动 蜘蛛中间件.下载中间件 下载中间件的地方可以写各种反爬的策略 1.使用pip安装, pip3 install sc ...

  10. Ajax实现文件的上传

    Ajax实现文件的上传 准备 ajax的参数补充 type不写的话默认是GET dataType和ContentType: dataType: 浏览器发给服务器希望返回的数据类型 .. 如果明确地指定 ...