随着面向服务(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. ubuntu14.04-64位机配置android开发环境,ADT,sdk,eclipsea

    这是一篇没有图的好文章,对于学习android的非常实用 1.首先到orcale官网    http://www.oracle.com/technetwork/java/javase/download ...

  2. C# 源码 AForge.NET

    AForge.NET是一个专门为开发者和研究者基于C#框架设计的,他包括计算机视觉与人工智能,图像处理,神经网络,遗传算法,机器学习,模糊系统,机器人控制等领域.这个框架由一系列的类库组成.主要包括有 ...

  3. 微信小程序 - ios不能播放背景音乐

    由以下原因导致的 1. 未设置标题(backgroundPlayer.title)或标题为空 2. url只能英文,不能出现空格以及其它字符(中文.韩文.日文等)- iOS要求英文路径

  4. Linux内核配置:定制配置选项

    很多嵌入式开发人员都需要在Linux内核中添加一些特性,以支持特别的定制硬件. ARM架构的顶层Kconfig文件中,可以看到一个名为System Type的菜单项.在ARM system type提 ...

  5. HttpLuaModule——翻译(Nginx API for Lua)

    现在我已经将翻译的内容放到:http://wiki.nginx.org/HttpLuaModuleZh Nginx API for Lua Introduction 各种各样的*_by_lua和*_b ...

  6. PASCAL知识

    API Index http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delph ...

  7. java 八种基本数据类型之初始值、取值范围、对应的封装类

      CreateTime--2017年12月6日10:03:53 Author:Marydon 一.java数据类型之基本数据类型 (二)八种基本数据类型的特征 import java.math.Bi ...

  8. mysql日期相关的函数

    1.获取当前时间: /** 获得当前日期+时间(date + time)函数:now(), 常用 **/ select now() from dual; /** 获取当前时间戳,current_tim ...

  9. html 5检查Mobile App是否在线

    在PhoneGap应用,或者黑莓Java/HTML混搭应用中,如何使用JavaScript检查Mobile App网络连接状态呢? <script type="text/javascr ...

  10. NotesDocument 作为函数返回值的问题

    如下代码 Set recipientDoc = getDocInNAB(“search string”) If Not recipientDoc Is Nothing Then ‘In debug I ...