• C# 进行用(反)序列化方法实现xml与对象进行互相转换


    在开发过程中我们可能会进行xml字符传与指定对象之间进行互相转换。用XmlSerializer对象可以把C#对象转换成xml字符串,当然也可以把xml字符串反序为指定的对象。我们用到以下的类方法进行操作

    public class XmlHelper
        {
            /// <summary>
            /// 把对象转换成xml
            /// </summary>
            /// <param name="o"></param>
            /// <returns></returns>
            public static string serialize(object o)
            {
                var xml = "";
                if (o == null)
                {
                    return xml;
                }
    
                return serialize(o, o.GetType());
            }
    
            /// <summary>
            /// 把对象转换成xml
            /// </summary>
            /// <param name="o"></param>
            /// <param name="type">指定对象类型</param>
            /// <returns></returns>
            public static string serialize(object o, Type type)
            {
                var xml = "";
                if (o == null)
                {
                    return xml;
                }
    
                //序列化对象
                XmlSerializer serializer = new XmlSerializer(type);
                // 输出
                Stream stream = new MemoryStream();
                serializer.Serialize(stream, o);
                stream.Position = 0;
                StreamReader sr = new StreamReader(stream);
                xml = sr.ReadToEnd();
                sr.Dispose();
                sr.Close();
    
                stream.Dispose();
                stream.Close();
    
                return xml;
            }
    
            /// <summary>
            /// 反序化xml为对象
            /// </summary>
            /// <param name="xml"></param>
            /// <param name="type"></param>
            /// <returns></returns>
            public static object deserialize(string xml, Type type)
            {
                try
                {
                    using (StringReader sr = new StringReader(xml))
                    {
                        XmlSerializer serializer = new XmlSerializer(type);
                        return serializer.Deserialize(sr);
                    }
                }
                catch (Exception e)
                {
                    return null;
                }
            }
        }

    ,在使用时可如下操作:

    //对象定义
    [XmlRoot("DocumentElement")]
        public class DocumentElement
        {
            //[XmlArray("DataTables"), XmlArrayItem("DataTable")] //DataTables内包含DataTable
            [XmlElement("DataTable")] //DataTable平行出现,不出现data
            public List<MyDataTable> data { get; set; }
        }
    
        [XmlRoot("DataTable")]//在xml文本需要DataTable为节点名,但DataTable又是C#关键字的时候
        public class MyDataTable
        {
            [XmlElement(IsNullable = true)]
            public string oper { get; set; }
            [XmlElement(IsNullable = true)]
            public string gcode { get; set; }
            [XmlElement(IsNullable = true)]
            public string charge_code { get; set; }
            [XmlElement(IsNullable = true)]
            public string gname { get; set; }
            [XmlElement(IsNullable = true)]
            public string gname1 { get; set; }
            [XmlElement(IsNullable = true)]
            public string spn { get; set; }
            [XmlElement(IsNullable = true)]
            public string produrceid { get; set; }
            [XmlElement(IsNullable = true)]
            public string produrce { get; set; }
            [XmlElement(IsNullable = true)]
            public string unit { get; set; }
            [XmlElement(IsNullable = true)]
            public string caseunit { get; set; }
            [XmlElement(IsNullable = true)]
            public string pack { get; set; }
            [XmlElement(IsNullable = true)]
            public string zjm { get; set; }
            [XmlElement(IsNullable = true)]
            public string status { get; set; }
            public decimal price { get; set; }
            public decimal price1 { get; set; }
            [XmlElement(IsNullable=true)]
            public string zbh { get; set; }
    
        }
    //测试序列化
                var xml = "";
                DocumentElement de = new DocumentElement();
    
    
                var mdt = new MyDataTable();
                mdt.caseunit = "";
                mdt.charge_code = "X24538";
    
                var mdt2 = new MyDataTable();
                mdt2.caseunit = "";
                mdt2.charge_code = "X24538";
    
                de.data = new List<MyDataTable>();
                de.data.Add(mdt);
                de.data.Add(mdt2);
    
                xml = XmlHelper.serialize(de);
                Console.WriteLine(xml);    

    ,接下来可以测试xml字符串转换成类对象

    先输入xml文件,XMLFile1.xml的内容:

    <?xml version="1.0" encoding="utf-8" ?>
    <DocumentElement xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <DataTable>
        <oper xsi:nil="true" />
        <gcode xsi:nil="true" />
        <charge_code>X24538</charge_code>
        <gname xsi:nil="true" />
        <gname1 xsi:nil="true" />
        <spn xsi:nil="true" />
        <produrceid xsi:nil="true" />
        <produrce xsi:nil="true" />
        <unit xsi:nil="true" />
        <caseunit></caseunit>
        <pack xsi:nil="true" />
        <zjm xsi:nil="true" />
        <status xsi:nil="true" />
        <price>0</price>
        <price1>0</price1>
        <zbh xsi:nil="true" />
      </DataTable>
      <DataTable>
        <oper xsi:nil="true" />
        <gcode xsi:nil="true" />
        <charge_code>X24538</charge_code>
        <gname xsi:nil="true" />
        <gname1 xsi:nil="true" />
        <spn xsi:nil="true" />
        <produrceid xsi:nil="true" />
        <produrce xsi:nil="true" />
        <unit xsi:nil="true" />
        <caseunit></caseunit>
        <pack xsi:nil="true" />
        <zjm xsi:nil="true" />
        <status xsi:nil="true" />
        <price>0</price>
        <price1>0</price1>
        <zbh xsi:nil="true" />
      </DataTable>
    </DocumentElement>

    测试反序化:

    var content = File.ReadAllText(Environment.CurrentDirectory + @"\XMLFile1.xml");
                DocumentElement de = XmlHelper.deserialize(content, typeof(DocumentElement)) as DocumentElement;
                if (de != null)
                {
                    var length = de.data.Count;
                    //Console.WriteLine(de.data[length-1].charge_code);
                    foreach (var item in de.data)
                    {
                        Console.WriteLine(item.charge_code);
                    }
                }

    关于参数的说明:

    1. [XmlArray("DataTables"), XmlArrayItem("DataTable")] //DataTables内包含DataTable
    默认情况下,集合数据在转换为xml字符串时,是父级DataTables包含子集DataTable的形式,如:<DataTables><DataTable>?</DataTable><DataTable>?</DataTable>...</DataTables>
    1. [XmlElement("DataTable")] //DataTable平行出现,
    当不需要显示父级DataTables这个字段时,用这种方式注释,DataTable平行出现,如:<DataTable>?</DataTable><DataTable>?</DataTable><DataTable>?</DataTable><DataTable>?</DataTable>...
  • 相关阅读:
    this.get_element .style为空或不是对象
    在server2008R2的IIS7中调试asp程序遇到的错误
    Server.Transfer 在两个窗体之间传递参数用法
    页面事务处理 ContextUtil.SetComplete(); 没有 MTS 对象上下文
    VS2008切换设计视图卡死 停止响应
    javascript对象小结
    [JavaScript] 最低公用标准的浏览器文档对象层次
    Linq 此提供程序只支持对返回实体或投影(包含所有标识列)的有序查询使用 问题的解决
    [Design] Factory Pattern
    [Database] SqlServer: Linq to Sql THE DATACONTEXT Change Processing
  • 原文地址:https://www.cnblogs.com/equation/p/16287562.html
Copyright © 2020-2023  润新知