序列化和反序列化方法
//将对象序列化为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>