XML序列化与反序列化

Original 2016-11-09 15:58:51 776
abstract:一、概述最近在使用第三方服务接口,要求请求输入和响应输出报文都是xml格式。因为是面向对象编程,所以调用接口之前已封装好请求参数的对象实体;同理,接口返回结果已封装成输出结果的对象实体。整个过程要求类对象序列化成xml字符串,以及xml字符串反序列化成类对象。xml格式如下:

一、概述

最近在使用第三方服务接口,要求请求输入和响应输出报文都是xml格式。因为是面向对象编程,所以调用接口之前已封装好请求参数的对象实体;同理,接口返回结果已封装成输出结果的对象实体。整个过程要求类对象序列化成xml字符串,以及xml字符串反序列化成类对象。

xml格式如下:



DLBREGSN
CHH




nameCHH
phone123
mail@


注意以下内容:

1.encoding="gbk2312",这个根据接口要求不同,可以在序列化时指定格式gbk2312 或 utf-8

2.xml必须有跟节点,根节点名称默认是类对象的类名,也可以给类对象加上xmlroot特性指定其他别名

3.元素节点包括四部分:节点名称(默认类属性名称)、节点开/闭之间的内容(默认类属性值)、节点属性(在类属性上加特性XmlAttribute)、节点属性值(已有XmlAttribute特性的类属性值)

4.节点又包含节点,且节点内容是相同元素的数组,数组对应类对象的object[ ]类型

5.类对象属性值为null值时,不被序列化成xml节点元素,当然也可以在序列化时设置强制要求被序列化;值为空时"",别序列化成自动闭合元素,如:

6.xml区分大小写,类对象名称、属性名称必须与xml元素大小写保持一致

二、定义实体类对象

[XmlRoot(ElementName = "stream")] // 定义xml节点元素别名,非默认的类名
public class Stream
{
public string status { get; set; }

public string statusText { get; set; }

public string subAccNo { get; set; }

public string subAccNm { get; set; }

public string hostNo { get; set; }

[XmlElement(ElementName = "list")]
public DataList List { get; set; }

}

[XmlRoot(ElementName = "list")]
public class DataList
{
[XmlAttribute]// name是list元素的属性,而不是list的子元素
public string name { get; set; }

//[XmlArray] // 被包含的层级关系,即row里面包含row
[XmlElement(ElementName = "row")] // 兄弟平级关系,即每个row是独立并行
public DataRow[] Row { get; set; }

}

[XmlRoot(ElementName = "row")]
public class DataRow
{
public string contactName { get; set; }
public string contactPhone { get; set; }
public string mailAddress { get; set; }
}

三、XML帮助类实现序列化与反序列化

public class XmlHelper
{
///


/// 将xml字符串反序列化对象
///

/// 对象类型
/// xml字符串
///
public static object Deserialize(Type type, string xml)
{
try
{
using (StringReader sr = new StringReader(xml))
{
XmlSerializer xmlS = new XmlSerializer(type);
return xmlS.Deserialize(sr);
}
}
catch (Exception)
{
return null;
}
}

///
/// 对象序列化成xml字符串
///

/// 对象类型
/// 被序列化的对象
/// xml编码格式:utf-8,gbk,gb2312
/// xml根节点名称
///
public static string Serializer(Type type, object obj,string encodingName="utf-8"
, string xmlRootName = "")
{

XmlSerializer xmlS = string.IsNullOrWhiteSpace(xmlRootName)
? new XmlSerializer(type)
: new XmlSerializer(type, new XmlRootAttribute(xmlRootName));

try
{
using (MemoryStream Stream = new MemoryStream())
{
XmlWriterSettings settings=new XmlWriterSettings();
settings.Encoding=Encoding.GetEncoding(encodingName);
settings.OmitXmlDeclaration=false; // 是否生成
settings.WriteEndDocumentOnClose = true;
settings.Indent = true; // 自动格式化,缩进对齐

XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add(string.Empty, string.Empty); // 去除默认生成的命名空间:xmlns:xsd和xmlns:xsi

XmlWriter xWr=XmlWriter.Create(Stream,settings);
xmlS.Serialize(xWr, obj, ns);

Stream.Position = 0;
using (StreamReader sr = new StreamReader(Stream, Encoding.GetEncoding(encodingName)))
{
string str = sr.ReadToEnd();
return str;
}
}
}
catch (Exception)
{
return string.Empty;
}
}
}


Release Notes

Popular Entries