asp.net c# 自定义实体类xml序列化

最近在对接时,有这样一份xml参数需要传输。

所以写了实体类序列化,记录一下

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Serialization;

namespace XmlDemo
{


    /* ****************************
     * 数组和列表都在序列化时,默认情况下会根据类型中的数据成员名称生成一个节点, 列表项会生成子节点,如果要重命名,可以使用[XmlArrayItem]和[XmlArray]来实现。 还可以直接用[XmlElement]控制不生成列表的父节点。
     * ****************************/

    /// <summary>
    /// 节点基类
    /// </summary>
    [Serializable]
    public class XBase { }

    [Serializable]
    [XmlRootAttribute("RECORDS", IsNullable = false)]
    public class RECORDS
    {
        /**
         * XmlArray当前节点别名 这个属性不写的话 当前节点就隐藏了
         * XmlElement是子节点别名
         * */
        [XmlElement("FormInfo")]
        public List<FormInfo> FormInfo { get; set; }

    }
    [Serializable]
    [XmlType("FormInfo")]
    public class FormInfo
    {
        /**
         * XmlArray当前节点别名 这个属性不写的话 当前节点就隐藏了
         * XmlElement是子节点别名
         * */
        /// <summary>
        /// 子元素集合Item
        /// </summary>
        [XmlElement("Item")]
        public List<FormItem> Items
        {
            get;
            set;
        }

        /**
         * XmlArray当前节点别名 这个属性不写的话 当前节点就隐藏了
         * XmlElement是子节点别名
         * */
        /// <summary>
        /// 子元素集合Item
        /// </summary>
        [XmlElement("AutoTable")]
        public List<AutoTable> AutoTables
        {
            get;
            set;
        }
        /// <summary>
        /// name属性
        /// </summary>
        [XmlAttribute("name")]
        public string NameAttribute { get; set; }

    }
    [Serializable]
    public class AutoTable : XBase
    {
        /// <summary>
        /// name属性
        /// </summary>
        [XmlAttribute("name")]
        public string NameAttribute { get; set; }

        /**
        * XmlArray当前节点别名 这个属性不写的话 当前节点就隐藏了
        * XmlElement是子节点别名
        * */
        /// <summary>
        /// 子元素集合AutoRow
        /// </summary>
        [XmlElement("AutoRow")]
        public List<AutoRow> AutoRows
        {
            get;
            set;
        }
    }
    [Serializable]
    public class AutoRow
    {
        /// <summary>
        /// 子元素集合Item
        /// </summary>
        [XmlElement("Item")]
        public List<FormItem> Items
        {
            get;
            set;
        }
    }
    [Serializable]
    [XmlType("Item")]
    public class FormItem : XBase
    {
        [XmlAttribute("name")]
        public string NameAttribute { get; set; }
        [XmlText]
        public string InnerText { get; set; }
    }
}

实际调用这么写:

            RECORDS rECORDS = new RECORDS
            {
                FormInfo = new List<FormInfo> {
                      new FormInfo{ NameAttribute="民用建筑项目节能审查",
                            Items=new List<FormItem>  {
                                new FormItem{
                                   NameAttribute="form_jsdw",  InnerText="XXXXXXXXX中心"
                                },
                                new FormItem{
                                   NameAttribute="form_xmmc",  InnerText="XXXXX(暂名)项目"
                                },
                                new FormItem{
                                   NameAttribute="form_jsdd",  InnerText="XXXXXX"
                                },
                                new FormItem{
                                   NameAttribute="xmlb",  InnerText="1"
                                },
                                new FormItem{
                                   NameAttribute="xmlxgg",  InnerText="2"
                                },
                                new FormItem{
                                   NameAttribute="xmlxzftrz",  InnerText="3"
                                },
                                new FormItem{
                                   NameAttribute="form_jsgm",  InnerText="总建筑面积25130平方米"
                                }
                           }
                            ,AutoTables=new List<AutoTable> {
                                new AutoTable{
                                     AutoRows=new List<AutoRow> {
                                          new AutoRow {
                                              Items=new List<FormItem>{
                                                   new FormItem {
                                                       InnerText="我是InnerText", NameAttribute="NameAttr"
                                                   }
                                              }
                                          },new AutoRow {
                                              Items=new List<FormItem>{
                                                   new FormItem {
                                                       InnerText="我是InnerText", NameAttribute="NameAttr"
                                                   }
                                              }
                                          }
                                     }
                                }
                           }
                      }
                 }
            };
            var asd = XmlSerializeHelper.XmlSerializer<RECORDS>(rECORDS);

附XmlSerializeHelper.cs类代码:

using System;
using System.IO;
using System.Text;
using System.Xml;
using System.Xml.Serialization;

namespace XmlDemo
{
    public static class XmlSerializeHelper
    {
        /// <summary>
        /// XML序列化
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="obj"></param>
        /// <returns></returns>
        public static string XmlSerializer<T>(T obj)
        {
            var settings = new XmlWriterSettings
            {
                Encoding = new UTF8Encoding(false),
                Indent = true
            };

            using (var ms = new MemoryStream())
            {
                using (var xw = XmlWriter.Create(ms, settings))
                {
                    var ns = new XmlSerializerNamespaces();
                    ns.Add("", "");
                    var serializer = new XmlSerializer(obj.GetType());
                    serializer.Serialize(xw, obj, ns);
                    return Encoding.UTF8.GetString(ms.ToArray());
                }
            }
        }

        /// <summary>
        /// XML反序列化
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="XmlString"></param>
        /// <returns></returns>
        public static T XmlDeserialize<T>(this string XmlString)
        {
            if (string.IsNullOrEmpty(XmlString))
                throw new ArgumentNullException("s");

            using (var ms = new MemoryStream(Encoding.UTF8.GetBytes(XmlString)))
            {
                using (var xr = XmlReader.Create(ms))
                {
                    var xmlSerializer = new XmlSerializer(typeof(T));
                    return (T)xmlSerializer.Deserialize(xr);
                }
            }
        }
    }
}

转载请说明出处:第六感博客 原文链接:

标签: C# Asp.Net XML

相关阅读:

C#使用RSA非对称加密字符串 附Helper帮助类

asp.net WebPage WebMvc 压缩输出html

asp.net 内置委托 Action 和 Func 和 Predicate

vs生成成功但发布时报错 未能将文件...复制到... 未能找到文件...

FluentData 报错 Error:Could not map ...字段名