随着面向服务(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. (转)Unity3D研究院之IOS&Android收集Log文件

    转自:http://www.xuanyusong.com/archives/2477 有段时间没有写过文章了,不知道大伙儿还记得雨松MOMO吗? 嘿嘿. 开发项目的时候尤其在处理与服务器交互这块,如果 ...

  2. Android利用RecognizerIntent识别语音并简单实现打电话动作

    关于Android利用RecognizerIntent识别语音并简单实现打电话,详细看实现代码例如以下: package com.example.recognizerintentactivity; i ...

  3. [Functional Programming] Create Reusable Functions with Partial Application in JavaScript

    This lesson teaches you how arguments passed to a curried function allow us to store data in closure ...

  4. artTemplate子模板include

    art.Template:https://github.com/aui/art-template 下面来实现利用模版来实现递归调用生成tree <script type="text/h ...

  5. Discuz! X3安装第三方主题出现:对不起,您安装的不是正版应用..的解决方法

    discuz 社区在更新到3.0以上后,增加了对插件的版本检测,在安装时,可能会出现:“对不起,您安装的不是正版应用,安装程序无法继续执行”的提示,要解决这个其实挺容易的,找到以下文件: /sourc ...

  6. 用Github pages搭建自己制作的网页

    本文固定链接http://blog.csdn.net/pspgbhu/article/details/51205264 本人自学前端一个多月,写个几个网页想要用来应聘,网上搜各种搭建站点的方法.发现不 ...

  7. Python学习笔记_04:Django框架简介

    目录 1 什么是Django? 2 Django框架的开发环境搭建 3 Django操作MySql数据库简介 4 功能强大的Django管理工具应用 1 什么是Django? Django是应用于We ...

  8. [转]一个简洁的 systemd 操作指南

    1.服务权限systemd有系统和用户区分:系统(/user/lib/systemd/system/).用户(/etc/lib/systemd/user/). 一般系统管理员手工创建的单元文件建议存放 ...

  9. ES6 class 技术点拾遗

    语法 方法不需要加function,方法之间不需要加分号 class Point { constructor(x, y) { this.x = x; this.y = y; } toString() ...

  10. http 请求报文

    1.报文 2.http请求方法 restful接口 post:创建 put:更新