转换工具类
/// <summary>
/// XML转换
/// </summary>
public class Helper
{
/// <summary>
/// 将实体对象转换成XML
/// </summary>
/// <typeparam name="T">实体类型</typeparam>
/// <param name="obj">实体对象</param>
public string EntityToXmlSerialize<T>(T obj)
{
try
{
using (StringWriter sw = new StringWriter())
{
Type t = obj.GetType();
XmlSerializer serializer = new XmlSerializer(obj.GetType());
serializer.Serialize(sw, obj);
sw.Close();
return sw.ToString();
}
}
catch (Exception ex)
{
throw new Exception("将实体对象转换成XML异常", ex);
}
}
/// <summary>
/// 将XML转换成实体对象
/// </summary>
/// <typeparam name="T">实体类型</typeparam>
/// <param name="strXML">XML</param>
public 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)
{
throw new Exception("将XML转换成实体对象异常", ex);
}
}
}
转换默认直接根据对象名和参数名生成XML
序列化常用Attribute讲解说明:
[XmlRootAttribute("MyCity")] // 当该类为Xml根节点时,
以此为根节点名称。
public class City
[XmlAttribute("AreaName")] // 表现为Xml节点属性。`<... AreaName="..."/>`
public string Name
[XmlElementAttribute("AreaId", IsNullable = false)] // 表现为Xml节点。`<AreaId>...</AreaId>`
public string Id
[XmlArrayAttribute("Areas")] // 表现为Xml层次结构,根为Areas,其所属的每个该集合节点元素名为类名。`<Areas><Area ... /><Area ... /></Areas>`
public Area[] Areas
[XmlElementAttribute("Area", IsNullable = false)] // 表现为水平结构的Xml节点。`<Area ... /><Area ... />...`
public Area[] Areas
[XmlIgnoreAttribute] // 忽略该元素的序列化。
[XmlArray("PO_LINE")]
[XmlArrayItem("RECORD")]//对象嵌套list对象时 同时使用这两个参数
序列化出现的问题
1.对象值为空时,xml节点不存在 此时使用IsNullable = true
举例: [XmlElement("id", IsNullable = true)]
2.数据值为空的属性。转化成xml时,格式不是成对的节点,不过也可以正常解析 格式:<name />
3.当序列数组时 attribute会失效 需要改为对象包含数组
例
public class A
{
[[XmlElement("Atr", IsNullable = true)]]
public string Data{get; set;}
}
此时如果直接将List<A>转换 不会有Atr属性,仍为Data
需要改为
public class B
{
public List<A> HH{get;set;}
}
转换对象B时 会生成Atr属性
模型注释案例
/// <summary>
/// 订单输出模型
/// </summary>
[XmlRoot("order", IsNullable = true)]
public class OrderResultModel
{
[XmlElement("bussiness")]
public string Bussiness { get; set; } = "order";
[XmlElement("order", IsNullable = true)]
public OrderModel Order{ get; set; }
}
/// <summary>
/// 订单信息
/// </summary>
[XmlRoot("order", IsNullable = true)]
public class OrderModel
{
[XmlElement("id", IsNullable = true)]
public string Id { get; set; } //phid pur_order_m
[XmlArray("matlist", IsNullable = true),XmlArrayItem("material", IsNullable = true)]
public List<MaterialModel> Matlist { get; set; }
}
/// <summary>
/// 清单
/// </summary>
public class MaterialModel
{
[XmlElement("id", IsNullable = true)]
public string Id { get; set; } //phid pur_order_d
[XmlElement("remark", IsNullable = true)]
public string Remark { get; set; }//remarks pur_order_d
}
部分转载:https://www.cnblogs.com/KeithWang/archive/2012/02/22/2363443.html