XML的序列化和反序列化

序列化和反序列化方法

//将对象序列化为XML,type:对象类型  obj:对象
public static string Serializer(Type type, object obj)
{
  MemoryStream Stream = new MemoryStream();
   //创建序列化对象 
   XmlSerializer xml = new XmlSerializer(type);
   try
   {
     //序列化对象 
      xml.Serialize(Stream, obj);
   }
   catch (InvalidOperationException)
   {
      throw;
   }
   Stream.Position = 0;
   StreamReader sr = new StreamReader(Stream, Encoding.UTF8);
   string str = sr.ReadToEnd();
   return str;
} 
//将XML反序列化为对象,type:需要反序列化成的对象类型,xml:xml字符串
public
static object Deserialize(Type type, string xml) { try { using (StringReader sr = new StringReader(xml)) { XmlSerializer xmldes = new XmlSerializer(type); return xmldes.Deserialize(sr); } } catch (Exception e) { return null; } }

将DataTable序列化为XML字符串

        /// <summary>
        /// 将DataTable对象转换成XML字符串
        /// </summary>
        /// <param name="dt">DataTable对象</param>
        /// <returns>XML字符串</returns>
        public static string DataTableToXml(DataTable dt)
        {
            if (dt != null)
            {
                try
                {
                    MemoryStream ms = new MemoryStream();
                    //根据ms实例化XmlWt
                    XmlTextWriter XmlWt = new XmlTextWriter(ms, Encoding.Unicode);
                    //获取ds中的数据
                    dt.WriteXml(XmlWt);
                    int count = (int)ms.Length;
                    byte[] temp = new byte[count];
                    ms.Seek(0, SeekOrigin.Begin);
                    ms.Read(temp, 0, count);
                    //返回Unicode编码的文本
                    UnicodeEncoding ucode = new UnicodeEncoding();
                    string returnValue = ucode.GetString(temp).Trim();
                    return returnValue;
                }
                catch (System.Exception ex)
                {
                    throw ex;
                }
                finally
                {
                    //释放资源
                    if (XmlWt != null)
                    {
                        XmlWt.Close();
                        ms.Close();
                        ms.Dispose();
                    }
                }
            }
            else
            {
                return "";
            }
        }

将XML反序列化为DataTable

public static DataTable XmlToDataTable(string xmlStr)
 {
         DataSet ds = null;   
         if (!string.IsNullOrEmpty(xmlStr))
         {
             try
             {
                 ds = new DataSet();
                 //读取字符串中的信息
                 StringReader StrStream= new StringReader(xmlStr);
                 //获取StrStream中的数据
                 XmlTextReader Xmlrdr= new XmlTextReader(StrStream);
                 //ds获取Xmlrdr中的数据                
                 ds.ReadXml(Xmlrdr);
                 return ds;
             }
             catch (Exception e)
             {
                 throw e;
             }
             finally
             {
                 //释放资源
                 if (Xmlrdr != null)
                 {
                     Xmlrdr.Close();
                     StrStream.Close();
                     StrStream.Dispose();
                 }
             }
         }
         else
         {
             return null;
         }

         if (ds != null && ds.Tables.Count > 0)
             return ds.Tables[0];
         return null;
}    

在序列化的过程中,遇到节点需要更换名称,或者节点添加属性的,可以通过以下操作来实现

根节点:[XmlType("testClass")]或者[XmlRoot("testClass")],两者都可以
元素节点:[XmlElement("name")]
属性节点:[XmlAttribute("id")]
列表子元素节点:[XmlArrayItem("Detail")]
列表元素自身:[XmlArray("Items")]
排除不需要序列化的成员:[XmlIgnore]
强制序列化成员顺序:[Order=1]
去掉List节点:[XmlElement("子节点名称")]

如果要将节点更换名称,可以在类的属性上面添加[XmlElement("name")],那么是新的名称

[XmlRoot("testClass")]
public class TestClass
{
  [XmlAttribute("id")]
  public string Id {get;set;}
  [XmlElement("order")]  
  public string Order {get;set;}      
  [XmlElement("product")]  
  public string Product {get;set;}  
  [XmlElement("testList")]
  public string List<Test> list {get;set;}
}

id会变成根节点的属性,order和product是节点,list是节点

<testClass id="">

<order></order>

<product></product>

<testList></testList>

<testList></testList>

</testClass>

原文地址:https://www.cnblogs.com/zfylzl/p/5643583.html