实战经验分享之C#对象XML序列化

.Net Framework提供了对应的System.Xml.Seriazliation.XmlSerializer负责把对象序列化到XML,和从XML中反序列化为对象。Serializer的使用比较直观,需要多注意的是XML序列化相关的Attribute,怎么把这些attribute应用到我们的对象,以及对象公共属性上面去,生成满足预期格式的XML。

需求来源于一文件转换项目,将一个XML格式的文件转换成另一种格式。公司的框架也大量使用了XmlSerializer来处理系统里大量配置,每一个文件配置文件对应一种类型的多个配置项。

关键知识点

序列化常用Attribute讲解说明

[XmlRootAttribute("MyCity", Namespace="abc.abc", IsNullable=false)]     // 当该类为Xml根节点时,以此为根节点名称。
public class City

[XmlAttribute("AreaName")]    // 表现为Xml节点属性。<... AreaName="..."/>
public string Name

[XmlElementAttribute("AreaId", IsNullable = false)]    // 表现为Xml节点。<AreaId>...</AreaId>
public string Id

[XmlArrayAttribute("Areas")]    // 表现为Xml层次结构,根为Areas,其所属的每个该集合节点元素名为类名。<Areas><Area ... /><Area ... /></Areas>
public Area[] Areas

[XmlElementAttribute("Area", IsNullable = false)]    // 表现为水平结构的Xml节点。<Area ... /><Area ... />...
public Area[] Areas

[XmlIgnoreAttribute]    // 忽略该元素的序列化。

实际案例

类定义:

1)    OrderEntity单据类XML里是最顶层的Root节点。

/// <summary>
    /// 订单信息
    /// </summary>
    [Serializable]
    [XmlRoot("Document")]
    public class OrderEntity
    {
        [XmlArray("Events"), XmlArrayItem("Event")]
        public OrderEvent[] Event { get; set; }
    }

2) OrderEvent单据类型(事件)描述实体

/// <summary>
    /// 单据类型(事件)描述信息
    /// </summary>
    [Serializable]
    public class OrderEvent
    {
        /// <summary>
        /// 单据名称
        /// </summary>
        [XmlAttribute("Name")]
        public string Name { get; set; }
        /// <summary>
        /// 库存动作
        /// </summary>
        [XmlAttribute("MainAction")]
        public string MainAction { get; set; }
        /// <summary>
        /// 单据明细项
        /// </summary>
        [XmlArray("DataField"), XmlArrayItem("Data")]
        public OrderDetail[] details { get; set; }
    }

3)、数据明细类

 /// <summary>
    /// 单据明细项目
    /// </summary>
    [Serializable]
    public class OrderDetail
    {
        [XmlAttribute("Code")]
        public string Code { get; set; }
        [XmlAttribute("Actor")]
        public string Actor { get; set; }
        [XmlAttribute("ActDate")]
        public string ActDate { get; set; }
        [XmlAttribute("CorpOrderID")]
        public string CorpOrderID { get; set; }
        [XmlAttribute("FromCorpID")]
        public string FromCorpID { get; set; }
        [XmlAttribute("ToCorpID")]
        public string ToCorpID { get; set; }
        [XmlAttribute("OwnerID")]
        public string OwnerID { get; set; }
    }

4)序列化的实际代码

#region 初始化订单对象并完成序列化
                                    OrderEntity result_File_Object = new OrderEntity
                                    {
                                        Event = new OrderEvent[]
                                        {
                                            new OrderEvent
                                            {
                                                Name =orderName ,
                                                MainAction= dt_Event.Rows[0]["MainAction"].ToString(),
                                                details = query.Where(d => d.Code!=string.Empty).ToList().ToArray()
                                            }
                                        }
                                    };
                                    Program.SerializerToXML<OrderEntity>(path + "\\" + fileName, result_File_Object);
                                    #endregion

  

 /// <summary>
        /// 把对象序列化成xml文件
        /// </summary>
        /// <typeparam name="T">对象的类</typeparam>
        /// <param name="outFile">输出的文件和路径</param>
        /// <param name="t">对象的实例</param>
        public static void SerializerToXML<T>(string outFile, T t) where T : class
        {
            using (System.IO.FileStream fs = new System.IO.FileStream(outFile, System.IO.FileMode.Create))
            {
                XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
                ns.Add("", "");
                XmlSerializer xs = new XmlSerializer(typeof(T));
                xs.Serialize(fs, t, ns);
                fs.Flush();
            }
        }

  

时间: 2024-09-28 16:08:37

实战经验分享之C#对象XML序列化的相关文章

Dubbo线程模型(结合Linux线程数限制配置的实战经验分享)

Dubbo官方文档: 用户指南 >> 示例 >> 线程模型 配置标签: <dubbo:provider/> <dubbo:protocol/> 实战经验分享(属用性能调优): Linux用户线程数限制导致的java.lang.OutOfMemoryError: unable to create new nativethread异常 # vi/etc/security/limits.d/90-nproc.conf # Default limit fornumb

【联想销售高手实战经验分享】做销售就一定要能喝酒吗?

联想销售高手实战经验分享 | 做销售就一定要能喝酒吗? 在中国,不喝酒真的做不了销售么?我很想知道有哪些行业或者有哪些公司的销售不用经常喝酒的? 我谈谈我自己的经历吧. 我很讨厌喝白酒,觉得难以下咽,即便是啤酒也因为怕长胖的缘故与家人朋友聚会的时候是能少喝就少喝,唯独喜欢品预调酒,经常买来喝着玩. 以下的文字里,喝酒都是喝白酒的意思. 2010年以前我都认为喝酒和做销售业绩没一毛钱关系,仅仅与哄自己领导开心有关系(以前美的的领导爱喝酒,你不陪领导喝高兴等于不给领导面子),做消费类产品的渠道销售,

unity 热更新 c# 实战经验分享(二) - 动态Protobuff协议,再也不用担心为了换条协议换包了 ~~!

先提前说明一下,如果哪位小伙伴 觉得生疏的话,可以看这篇博客的前面两个博客,里面讲述了 高大上 JSB,unity 热更新方案,用强大的宇宙第一编辑器vs 来开发 unity 热观更新脚本,更新c# 不在是梦 这次的demo 工程我已经长传了,地址 在这里http://pan.baidu.com/s/1qWQlXUW:下载后(放在D盘 放在D盘 放在D盘!!!!)里面的unity 工程直接打开然后运行main 场景 .就会出现下图,这篇博客唯一 的意义就在于这个demo,实战就是实战不跟你讲废话

unity 热更新 c# 实战经验分享(一)

demo 工程地址 :http://pan.baidu.com/s/1qWBYxqc 我们接上篇 内容继续讲 http://www.cnblogs.com/zyc-it/p/4820810.html (1)工程分离 什么叫工程分离呢,就是要把你的游戏包(后面简称 #主工程#),和你的热更新工程(后面简称 #热更新工程#) 分离开.首先我先说一下 ,我为什么要这么做: 原因:从github 上更新下来的 jsb的工程,把所有的热更新代码写在了unity 里面了,然后在 热更新工程里面 去引用这些c

C#对象XML序列化

一. 用法说明 [XmlRootAttribute("BASEINFO")]     // 当该类为Xml根节点时,以此为根节点名称. public class BASEINFO [XmlAttribute("IDCARD")]    // 表现为Xml节点属性.<... IDCARD="..."/> public string IDCARD [XmlElementAttribute("NAME", IsNulla

Azure从经典模式迁移至资源管理模式实战经验分享

目录 一.前言    2 二.三种迁移方式及优缺点    2 三.迁移准备工作    4 (一)支持的ASM IAAS资源    5 (二)支持的迁移范围    5 (三)不支持的功能和配置    7 四.迁移计划制定    10 五.LAB环境测试    10 六.迁移    11 七.迁移后的完整测试    16 八.附录-常见问题索引    17 一.前言 Azure IAAS在Mooncake正式支持ARM模式已经有一段时间了,ASM模式下大部分功能配置需要通过Powershell来配置

如何保持像素的完美?ps实战经验分享

[敬伟分享:如何保持像素的完美呢?]为了确保每一个像素的颜色.纹理和位置都准确地呈现,大多数人都会被搞得疲惫不堪.一不小心,一些很常用的操作像移动.旋转和粘贴就会让你的辛勤劳动付之东流.但是,如果能对你的工作流程做些小小的改动,就能在项目中始终保持作品的高质量. 像素完美之旋转 如果你不够小心,那么在Photoshop中旋转图层就会使像素遭到明显的破坏,出现模糊. 使用自由变换工具(或其他工具)把图层精确旋转90度或270度后,像素最终的显示效果将取决于图层的尺寸.如果图层的宽和高都是偶数,你就

requirejs实战经验分享

本文不谈如下概念:1. AMD/CMD:2. F2E模块化开发.是的,本文就是要指向内心,为需要使用requirejs构建中小型web应用的亲们提供参考.

&lt;经验杂谈&gt;C#/.Net中xml的Serialization序列化与DeSerializetion反序列化

1.先讲概念:.Net Framework提供了对应的System.Xml.Seriazliation.XmlSerializer负责把对象序列化到XML,和从XML中反序列化为对象.Serializer的使用比较直观,需要多注意的是XML序列化相关的Attribute,怎么把这些attribute应用到我们的对象,以及对象公共属性上面去,生成满足预期格式的XML.  本文列出了最常用的方法和特性,涵盖日常大部分的转换工作,希望大家在工作中快速上手.为了给大家直观的印象,这里给出具体的使用代码,