随着面向服务(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)

XmlSerializer 对象序列化成XML 自定义编码格式(gb2312)的更多相关文章

  1. C#对象序列化成XML,以及自定义标签名

    C#对象序列化操作: public class XMLHelper { /// <summary> /// 对象序列化成 XML String /// </summary> p ...

  2. 将对象序列化成XML字符串

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...

  3. 将Java对象序列化成JSON和XML格式

    1.先定义一个Java对象Person: public class Person { String name; int age; int number; public String getName() ...

  4. C#将对象序列化成JSON字符串

    C#将对象序列化成JSON字符串 public string GetJsonString() { List<Product> products = new List<Product& ...

  5. 匿名对象序列化为XML

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.X ...

  6. .Net使用Newtonsoft.Json.dll(JSON.NET)对象序列化成json、反序列化json示例教程

    JSON作为一种轻量级的数据交换格式,简单灵活,被很多系统用来数据交互,作为一名.NET开发人员,JSON.NET无疑是最好的序列化框架,支持XML和JSON序列化,高性能,免费开源,支持LINQ查询 ...

  7. 对象序列化成Json字符串 及 反序列化成对象

    一. public static string JsonSerializer<T>(T t)        {            DataContractJsonSerializer ...

  8. ObjC 利用反射和KVC实现嵌套对象序列化成JSON数据

    原理: 0.创建一个新的可变字典:NSMutableDictionary 1.采用class_copyPropertyList函数遍历对象的属性 2.property_getName获取属性名,val ...

  9. .NET 序列化成XML, 并且格式化

    现有Person类: [Serializable] public class Person { public string Name; public string Info; public Perso ...

随机推荐

  1. BigDecimal 的幂次方运算

    public static void main(String[] args){ BigDecimal bg1, bg2; bg1 = new BigDecimal("200000.45&qu ...

  2. JS构造函数内的方法与构造函数prototype属性上方法的对比

    本文的目的是让大家理解什么情况下把函数的方法写在JavaScript的构造函数上,什么时候把方法写在函数的 prototype 属性上;以及这样做的好处. 为了阅读方便,我们约定一下:把方法写在构造函 ...

  3. android中使用SharedPreferences存储数据

    使用SharedPreferences存储数据还是比较简单的 1.添加或修改数据(没有数据就添加,有数据就是修改): SharedPreferences.Editor editor = getShar ...

  4. iOS开发点滴 - 如何通过Segue写代码传递数据从一个ViewController到另一个ViewController(Swift代码)

    1. 拖线 按住Control键,用鼠标从源控制器的某个控件开始,拖动到目的控制器 2. 选择弹出类型并设置Segue Identifier 在弹出的对话框中,选择“Selection Segue-& ...

  5. LintCode: Median of two Sorted Arrays

    求第k个值 1.归并排序 归并到第k个值为止 时间复杂度:O(k) class Solution { public: // merge-sort to find K-th value double h ...

  6. php基础系列:从用户登录处理程序学习mysql扩展基本操作

    用户注册和登录是网站开发最基本的功能模块之一,现在通过登录处理程序代码来学些下php对mysql的基本操作. 本身没有难点,主要是作为开发人员,应该能做到手写这些基本代码,算是自己加强记忆,同时希望能 ...

  7. SHELL字符串使用总结

    1.获取字符串的长度,${#str} #设置字符串 $ str="liqiu" #打印字符串 $ echo $str liqiu #继续打印字符串 $ echo ${str} li ...

  8. selenium安装使用

    pip isntall selenium chromedriver download copy到chrome的安装目录, 并将这个路径加到环境变量的path中 chromedriver与chrome各 ...

  9. httpclient Accept-Encoding 乱码

    解决方法 HttpEntity httpEntity = httpResponse.getEntity(); if (httpEntity != null) { if (httpEntity.getC ...

  10. iPad Air 2全然评測:可怕的三核CPU、六核GPU

    在了解了三核心A8X的基本情况后.我们再来通过測试数据,全面地了解一下iPad Air 2的性能表现,包含CPU.GPU.存储.电池.屏幕.摄像头.导航等等. [CPU性能測试:三核太可怕了] 移动处 ...