XML序列化与反序列化接口对接实战


关键字:c# .NET XML 序列化 反序列化

点击查看 XmlParser 工具类
  public static class XmlParser<T>
  {
  private static XmlSerializer fXmlSerializer = null;
  private static UTF8Encoding fUtf8 = new UTF8Encoding();
   
  ///
  /// 带头信息;无命名空间
  ///
  ///
  ///
  public static string ToXml(T item)
  {
  if (fXmlSerializer == null)
  {
  fXmlSerializer = new XmlSerializer(typeof(T));
  }
   
  using (var ms = new MemoryStream())
  {
  //XmlSerializer不給Encoding,其XML宣告會是UTF-16 ;而且不能直接用Encoding.UTF8
  var xmlWriter = new XmlTextWriter(ms, fUtf8);
   
  XmlSerializerNamespaces xsnp = new XmlSerializerNamespaces();
  xsnp.Add(string.Empty, string.Empty);
   
  fXmlSerializer.Serialize(xmlWriter, item, xsnp);
  string rst = Encoding.UTF8.GetString(ms.ToArray());
   
  return rst;
  }
  }
   
  ///
  /// 获取Xml段;不带Xml头
  ///
  ///
  ///
  public static string ToXmlRemoveHead(T item)
  {
  var result = ToXml(item);
  if (!string.IsNullOrEmpty(result))
  {
  var firtPos = result.IndexOf("?>");
  if (firtPos > -1)
  {
  result = result.Remove(0, firtPos + 2);
  }
  }
  return result;
  }
   
  public static T FromXml(string str)
  {
  if (fXmlSerializer == null)
  {
  fXmlSerializer = new XmlSerializer(typeof(T));
  }
   
  using (XmlReader reader = new XmlTextReader(new StringReader(str)))
  {
  return (T)fXmlSerializer.Deserialize(reader);
  }
  }
  }

1、常规XML示例

VS提供了工具


左边为用VS粘贴生成的代码,我喜欢手动改为右边的定义。

1.2、实体类示例

用上面提供的工具类,非常方便:

  //读出xml
  var xml = File.ReadAllText("Sample.xml");
   
  //反序列化,转成实体
  var entity = XmlParser.FromXml(xml);
   
  //序列化,转成字符串
  var xml2 = XmlParser.ToXml(entity);


调试看出,XML转成对象之后再转成XML,得到当初一样的XML内容。

该工具类在反序列化读取XML时能自动读出CDATA节点内容,在序列化时对于需要转义的字符也会进行转义。产生的字符串是格式良好能通过验证的有效XML。

在大多数正常的系统对接中,通常上面的定义可以解决碰到的大多数对接需求;

如果是新接口定义,也建议有条件的话按这种子节点层次分明没有过多的格式要求来定义结构实现业务。子节点只用元素或只用属性,各就各位,所谓元素属性子节点,简单规范好理解。

当然现实中不可避免,会有一些其他的需求。

2、进一步的需求

  <?xml version="1.0" encoding="utf-8" ?>
  <root>
  <title>标题title>
  <items>
  <item code="0">
  <code>C001code>
  <name>张三name>
  item>
  <item code="1">
  <code>C002code>
  <name>李四name>
  item>
  items>
  root>
2.2.1、对应实体
  <?xml version="1.0" encoding="utf-8" ?>
  <root>
  <title>标题title>
  <details name="明细">
  <detail key="tel">张三detail>
  <detail key="mobile">李四detail>
  details>
  root>
2.2.1、对应实体

3.1、序列化要输出CDATA节点


VS格式化后对比

 XML格式检查,格式化显示;最好用的工具依然是宇宙最强IDE-VS

3.2、不区分大小写

XML格式在文件存储中也很常用,Word文档可以用XML存储,PowerDesigner的PDM文件也是XML格式,解释这类复杂的XML可能要用到xslt,比如是否能支持完全不区分大小写的XML读取,这块用的很少没有实际接触,不展开/展不开。

5、平台杂谈

出处:https://www.cnblogs.com/juntor/p/xml-serialize-deserialize.html

XML