• 实战经验分享之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();
                }
            }
    

      

  • 相关阅读:
    TranslateAnimation类:位置变化动画类
    android 启动第三方程序的代码(利用ComponentName)
    android背景选择器总结
    Spinner控件怎样在subActivity中使用
    Android 自定义 spinner (背景、字体颜色)
    AndroidWebView
    android gravity属性和weight属性
    android得到控件在屏幕中的位置
    解决android自定义标题充满的问题
    android中ListView的常用样式和属性
  • 原文地址:https://www.cnblogs.com/datacool/p/datacool_XmlSerializer.html
Copyright © 2020-2023  润新知