c# XML與類互轉,及錯誤解決方法

 轉換方法

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Serialization;

namespace WindowsFormsApplication1
{
    class XmlSerializeHelper
    {
        #region 使用演示
        //aaa  類名
        //Example 實例名
        //strxml xml字符串
        
        string strxml;
        //反序列化演示
        //aaa Example = XmlSerializeHelper.DESerializer<aaa>(strxml); 
        //序列化演示
        //string strxml = XmlSerializeHelper.XmlSerialize<aaa>(Example);
        #endregion

        /// <summary>
        /// 實體類轉換成XML
        /// </summary>
        /// <typeparam name="T">類名</typeparam>
        /// <param name="obj">T類名的實例</param>
        /// <returns></returns>
        public static string XmlSerialize<T>(T obj)
        {
            using (StringWriter sw = new StringWriter())
            {
                Type t = obj.GetType();
                XmlSerializer serializer = new XmlSerializer(obj.GetType());
                serializer.Serialize(sw, obj);
                sw.Close();
                return sw.ToString();
            }
        }
        



        /// <summary>
        /// XML轉換成實體類-方法1
        /// </summary>
        /// <typeparam name="T">對應的類</typeparam>
        /// <param name="strXML">XML字符串</param>
        /// <returns></returns>
        public static T DESerializer<T>(string strXML) where T : class
        {
            try
            {
                using (StringReader sr = new StringReader(strXML))
                {
                    XmlSerializer serializer = new XmlSerializer(typeof(T));
                    return serializer.Deserialize(sr) as T;
                }
            }
            catch (Exception ex)
            {
                return null;
            }
        }

        /// <summary>
        /// XML轉換成實體類-方法2
        /// </summary>
        /// <param name="xmlStr"></param>
        /// <param name="type"></param>
        /// <returns></returns>
        public static object DeserializeFromXml(string xmlStr, Type type)
        {
            try
            {
                using (StringReader sr = new StringReader(xmlStr))
                {
                    XmlSerializer xs = new XmlSerializer(type);
                    return xs.Deserialize(sr);
                }
            }
            catch (Exception ex)
            {
                throw (ex);
            }
        }
        //Request
        //


    }
}

小技巧:在建立xml對應類時可自動建立,方法如下:

  1. 將完整的XML文本複製下來
  2. 新建一個類,將光標放在準備粘貼的位置
  3. 點擊VS左上角的 [編輯] - [選擇性粘貼] - [將XML粘貼爲類]

 

問題及解決

問題:在轉換後的實體類中,有些屬性因爲業務需求,需要修改類型爲Int32,Uint32等數字類型,但是給出的xml文本中,此項可能會沒有值,導致在反序列化時會出錯(即使在get方法中容錯也不行)

解決:因爲在反序列化的時候接受的屬性是數字類型且xml文本中爲空,就會出錯,無論是否在get方法中容錯;所以用屬性類型爲string的屬性進行反序列化的對接,具體容錯和賦值可在該string類型內的get方法中進行(可賦值給其他數值類型屬性,string類型屬性僅當做反序列化時的對接口),具體操作如下

舉例說明:反序列化的類中有屬性int num 和 string str 兩個屬性

//對應的實體類
public partial class aaa
    {
        public string str { get; set; }

        [XmlIgnore]//取消反序列化
        public int num;

        //用string類型的屬性來反序列化,將值轉賦給原數值屬性num
        [XmlElement(ElementName = "num")]//反序列化對應的屬性名
        private string numStr
        {
            get
            {
                return this.num.ToString();
            }
            set
            {
                Int32 num1;
                Int32.TryParse(value.ToString(), out num1);
                this.num = num1;
            }
        }
        
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章