zoukankan      html  css  js  c++  java
  • XmlSerializer 对象序列化成XML 自定义编码格式(gb2312)

    随着面向服务(SOA)的开发方式的兴起,客户端和服务端之间的消息传送,很多采用了XML的格式。但是大家在日常的开发中,应该会有这么种体验,就是组织xml格式的代码太繁琐,这篇随笔也是为了和大家分享下简便的组织xml字符串的解决方案。

    闲话不多说,我们直接上源码:

    (1)自定义的实体类源码(简单的序列化我就不在赘述),大家可以仔细看下这个实体类源码中包含了好几个类,然后类之间有着层级调用,这样的方式就是为了在序列化的时候实现xml元素包含元素的形式;如果想要实现同一个元素并列展示,那么就需要声明为数组类型 如下的public long[] BlockID { get; set; }

    所有要序列化的字段或者类都需要为public

    复制代码
     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 using System.Xml.Serialization;
     6 
     7 namespace Message.Entity
     8 {
     9     [XmlRoot("Message")]//标记根节点的名字
    10     public class DYAreaTypeMessage
    11     {
    12         public Header Header{ get; set; }
    13         public Payload Payload { get; set; }
    14     }
    15 
    16     [Serializable]
    17     public class Header
    18     {
    19         public string Verb { get; set; }
    20         public string Noun { get; set; }
    21     }
    22 
    23     [Serializable]
    24     public class Payload
    25     {
    26         public NetworkChangeDetail NetworkChangeDetail { get; set; }
    27     }
    28 
    29     [Serializable]
    30     public class DYAreaType
    31     {
    32         [XmlElement("BlockID",IsNullable=false)]//如果自己不定义元素的名字 ,那么序列化生成的元素就会变成字段类型的名称
    33         public long[] BlockID { get; set; }//注意(1)该地方是一个数组的形式,不可以用list代替,不然将不能序列化
    34     }
    35 
    36     [Serializable]
    37     public class NetworkChangeDetail
    38     {
    39         public DYAreaType DYAreaType
    40         {
    41             get;
    42             set;
    43         }
    44 
    45         [XmlElement("MessageID",IsNullable=false)]
    46         public string MessageID
    47         {
    48             get;
    49             set;
    50         }
    51         [XmlElement("Buro")]
    52         public string Buro
    53         {
    54             get;
    55             set;
    56         }
    57         [XmlElement("SubBuro")]
    58         public string SubBuro
    59         {
    60             get;
    61             set;
    62         }
    63 
    64         [XmlElement("Description")]
    65         public string Description
    66         {
    67             get;
    68             set;
    69         }
    70         [XmlElement("DateTime")]
    71         public string DateTime
    72         {
    73             get;
    74             set;
    75         }
    76     }
    复制代码
    (2)序列化实现代码
      序列化的实现方法其实很简单 使用.net提供的XmlSerializer 类就可以了 ,
                 XmlSerializer serializer = new XmlSerializer(typeof(类名));
                 serializer.Serialize(textWriter,类的实例);//参数说明可查看msdn
    但是我们一般会遇到一个一问题就是要指定xml的编码格式,这个地方让我也蛋疼了好一会,后来解决方式是这样的
     MemoryStream ms = new MemoryStream();//定义一个内存流
     XmlTextWriter textWriter = new XmlTextWriter(ms,Encoding.GetEncoding("gb2312"));//定义输出的编码格式
    
    
    通过以上两句代码即可实现自定义编码格式,然后还有个就是把内存流转成字符串
           string xmlMessage = Encoding.UTF8.GetString(ms.GetBuffer());
    复制代码
     1         /// <summary>
     2         /// 创建消息的xml语句
     3         /// </summary>
     4         /// <param name="blockID"></param>
     5         /// <param name="buro"></param>
     6         /// <param name="subBuro"></param>
     7         /// <param name="Description"></param>
     8         public string CreateMessageXML(long[] blockID, string buro, string subBuro, string Description, long activityID, out bool isSerializer)
     9         {
    10             isSerializer = false;
    11             CISP.Message.Entity.DYAreaTypeMessage dyArea = new CISP.Message.Entity.DYAreaTypeMessage();
    12             dyArea.Header = new CISP.Message.Entity.Header() { Verb = "Update", Noun = "NetworkChangeDetail" };
    13             dyArea.Payload = new CISP.Message.Entity.Payload();
    14             dyArea.Payload.NetworkChangeDetail = new CISP.Message.Entity.NetworkChangeDetail()
    15             {
    16                 MessageID = activityID.ToString(),
    17                 Buro = buro,
    18                 SubBuro = subBuro,
    19                 Description = Description,
    20                 DateTime = DateTime.Now.ToString("G")
    21             };
    22 
    23             dyArea.Payload.NetworkChangeDetail.DYAreaType = new CISP.Message.Entity.DYAreaType()
    24             {
    25                 BlockID = blockID
    26             };
    27 
    28             MemoryStream ms = new MemoryStream();
    29            // XmlTextWriter textWriter = new XmlTextWriter(ms, Encoding.GetEncoding("UTF-8"));
    30             StreamWriter textWriter = new StreamWriter(ms, Encoding.GetEncoding("gb2312"));
    31             XmlSerializer serializer = new XmlSerializer(typeof(CISP.Message.Entity.DYAreaTypeMessage));
    32             serializer.Serialize(textWriter, dyArea);
    33 
    34             string xmlMessage = Encoding.UTF8.GetString(ms.GetBuffer());
    35             isSerializer = true;
    36             ms.Close();
    37             textWriter.Close();
    38             return xmlMessage;
    39         }
    复制代码

     (3)最后我们看下结果:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    <?xml version="1.0" encoding="gb2312"?>//不知道为何指定为utf8变成了gb2312
    <Message xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <Header>
        <Verb>Update</Verb>
        <Noun>NetworkChangeDetail</Noun>
      </Header>
      <Payload>
        <NetworkChangeDetail>
          <DYAreaType>
            <BlockID>30000299430897</BlockID>
            <BlockID>30000299511558</BlockID>
            <BlockID>30000101714620</BlockID>
            <BlockID>30000211294903</BlockID>
            <BlockID>30000299425996</BlockID>
            <BlockID>30000299425985</BlockID>
          </DYAreaType>
          <MessageID>604186</MessageID>
          <Buro>335100000</Buro>
          <SubBuro>0000145222</SubBuro>
          <Description>fff</Description>
          <DateTime>2013-12-9 13:34:52</DateTime>
        </NetworkChangeDetail>
      </Payload>
    </Message>

    http://www.cnblogs.com/yukaizhao/archive/2011/07/22/xml-serialization.html 这篇博客中提到以下注意点,仅供参考 没有去验证过。

    我们在使用XmlSerializer序列化,初始化XmlSerializer对象时最好使用下面两个构造函数否则会引起内存泄漏。
    XmlSerializer(Type)
    XmlSerializer.XmlSerializer(Type, object)

  • 相关阅读:
    稳扎稳打Silverlight(13) 2.0交互之鼠标事件和键盘事件
    稳扎稳打Silverlight(17) 2.0数据之详解DataGrid, 绑定数据到ListBox
    再接再厉VS 2008 sp1 + .NET 3.5 sp1(2) Entity Framework(实体框架)之详解 Linq To Entities 之一
    稳扎稳打Silverlight(8) 2.0图形之基类System.Windows.Shapes.Shape
    稳扎稳打Silverlight(11) 2.0动画之ColorAnimation, DoubleAnimation, PointAnimation, 内插关键帧动画
    稳扎稳打Silverlight(21) 2.0通信之WebRequest和WebResponse, 对指定的URI发出请求以及接收响应
    稳扎稳打Silverlight(16) 2.0数据之独立存储(Isolated Storage)
    稳扎稳打Silverlight(9) 2.0画笔之SolidColorBrush, ImageBrush, VideoBrush, LinearGradientBrush, RadialGradientBrush
    稳扎稳打Silverlight(23) 2.0通信之调用WCF的双向通信(Duplex Service)
    游戏人生Silverlight(1) 七彩俄罗斯方块[Silverlight 2.0(c#)]
  • 原文地址:https://www.cnblogs.com/Alex80/p/8675378.html
Copyright © 2011-2022 走看看