当前位置: 首页 > news >正文

php xml序列化,深入理解:XML与对象的序列化与反序列化

这篇文章主要讲述XML与对象的序列化与反序列化。并且会附上一些简单的序列化与反序列化方法,供大家使用。

假设我们在一个Web项目中有这样两个类

public class Member

{

public string Num { get; set; }

public string Name { get; set; }

}

public class Team

{

public  string Name;

public  List Members { get; set; }

}

假设我们需要把Team类的一个实例POST到一个URL,

当然,使用Form隐藏域提交就可以完成该功能。

如果该Team包括30条数据呢?为了区分每个Member,我们得给参数的名字加上后缀。这就要一大串的隐藏域来完成:

@model Team

...

document.getElementById("submitForm").submit();

还敢想象一下如果Team再复杂一些,嵌套再多一些的情况么?

呃,即使你愿意这么传数据,对方看到一坨参数名就够头疼了。

我们都知道对象是不能在网络中直接传输的,不过还有补救的办法。

XML(Extensible Markup Language)可扩展标记语言,本身就被设计用来存储数据,任何一个对象都可以用XML来描述。以Team类为例:

Development

001

Marry

002

John

这样一个XML文档就表示了Team一个实例。

聪明的看官应该已经想到,XML是可以作为对象信息的载体在网络中传输,因为它是文本形式的。

怎么进行XML文档与对象的相互转换呢?

XmlSerializer类就是干这个活的。      命名空间:System.Xml.Serialization

程序集:System.Xml(在 system.xml.dll 中)现在这里展示了一个提供序列化与反序列化方法的EncodeHelper类。

Deserialize方法将XML字符串转换为指定类型的对象;

Serialize方法则将对象转换为XML字符串。

///

/// 提供xml文档序列化 反序列化

///

public sealed class EncodeHelper

{

///

/// 反序列化XML字符串为指定类型

///

public static object Deserialize(string Xml, Type ThisType)

{

XmlSerializer xmlSerializer = new XmlSerializer(ThisType);

object result;

try

{

using (StringReader stringReader = new StringReader(Xml))

{

result = xmlSerializer.Deserialize(stringReader);

}

}

catch (Exception innerException)

{

bool flag = false;

if (Xml != null)

{

if (Xml.StartsWith(Encoding.UTF8.GetString(Encoding.UTF8.GetPreamble())))

{

flag = true;

}

}

throw new ApplicationException(string.Format("Couldn't parse XML: '{0}'; Contains BOM: {1}; Type: {2}.",

Xml, flag, ThisType.FullName), innerException);

}

return result;

}

///

/// 序列化object对象为XML字符串

///

public static string Serialize(object ObjectToSerialize)

{

string result = null ;

try

{

XmlSerializer xmlSerializer = new XmlSerializer(ObjectToSerialize.GetType());

using (MemoryStream memoryStream = new MemoryStream())

{

XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, new UTF8Encoding(false));

xmlTextWriter.Formatting = Formatting.Indented;

xmlSerializer.Serialize(xmlTextWriter, ObjectToSerialize);

xmlTextWriter.Flush();

xmlTextWriter.Close();

UTF8Encoding uTF8Encoding = new UTF8Encoding(false, true);

result= uTF8Encoding.GetString(memoryStream.ToArray());

}

}

catch (Exception innerException)

{

throw new ApplicationException("Couldn't Serialize Object:" + ObjectToSerialize.GetType().Name, innerException);

}

return result;

}

}

要使用这个类需要添加以下引用

using System;

using System.Text;

using System.IO;

using System.Xml;

using System.Xml.Serialization;下面我们用一个控制台程序来演示一下这个类是如何工作的。这里是程序的Main函数。

static void Main(string[] args)

{

List Members = new List();

Member member1 = new Member { Name = "Marry", Num = "001" };

Member member2 = new Member { Name = "John", Num = "002" };

Members.Add(member1);

Members.Add(member2);

Team team = new Team { Name = "Development", Members = Members };

var xml =EncodeHelper.Serialize(team);//序列化

Console.Write(xml);//打印序列化后的XML字符串

Console.ReadLine();

Team newTeam = EncodeHelper.Deserialize(xml, typeof(Team)) as Team;//反序列化时需要显式的进行类型转换

Console.WriteLine("Team Name:"+newTeam.Name);//显示反序列化后的newTeam对象

foreach (var member in newTeam.Members)

{

Console.WriteLine("Member Num:" + member.Num);

Console.WriteLine("Member Name:" + member.Name);

}

Console.ReadLine();

}

在执行完Console.Write(xml)这行代码后,就可以看到打印出来的XML文档了。

Development

001

Marry

002

John

与我在文章开头给出的例子是一模一样的。

最终反序列化出来的newTeam对象打印出来是这样的结果。

Team Name:Development

Member Num:001

Member Name:Marry

Member Num:002

Member Name:John回到我们开头的Web通信的例子,

利用XML序列化与反序列化来进行对象传递,我们只需要把需要传递的对象序列化为XML字符串,使用一个隐藏域进行form提交就可以搞定咯!

接收方再将接收到的XML字符串反序列化成预设的对象即可。前提是双方必须约定序列化与反序列化的过程一致,且对象相同。

最后我们来看一下怎么利用一些特性来控制序列化与反序列化操作的过程。我们把开始的类改一下:

public class Member

{

[XmlElement("Member_Num")]

public string Num { get; set; }

public string Name { get; set; }

}

[XmlRoot("Our_Team")]

public class Team

{

[XmlIgnore]public string Name;

public List Members { get; set; }

}

然后我们再次执行刚才的控制台程序,序列化结果变成了这样:

001

Marry

002

John

本来的根节点Team变成了Our_Team,Member的子节点Num变成了Member_Num,并且Team的Name子节点被忽略了。

可见特性XmlRoot可以控制根节点的显示和操作过程,XmlElement则针对子节点。如果某些成员被标记XmlIgnore,则在序列化与反序列化过程中会被忽略。

这些特性的具体内容可以在MSDN查看,就不多讲了。

有了这些知识,在网络中传递对象数据应该已经难不倒各位看官了把。^_^

相关文章:

  • matlab ceil,Matlab中的取整函数fix, floor, ceil与round
  • php 创建mssql 表,在php表中显示MSSQL选择数据
  • matlab 热图,基于表格数据创建热图
  • getlocation.php,关于微信小程序 location API接口的解析
  • php 调用未定义方法,关于php:Laravel调用未定义的方法create()和save()
  • eclipse java 源代码,ECLIPSE 调试java 源码
  • excel按条件查询mysql,excel多个表格满足条件的数据库-excel表格满足多条件的数据汇总(vlookup?)...
  • php多张图片制作成视频教程,PS如何将一张图片做成多张图片叠加效果
  • matlab查看hdf5数据,Matlab 操作 HDF5文件
  • 蓝桥杯java c组真题解析,蓝桥杯C语言C组校内赛题目解析
  • empty reply from server php,php curl连接返回:Empty reply from server
  • oracle掉电后ora 00600,oracle断电重启之ORA-00600[4194]
  • oracle+怎么清理碎片,oracle 收缩表、清理碎片,释放空间
  • oracle数据库程序题,oracle数据库经典练习题及答案
  • oracle的architecture,oracle architecture overview
  • CentOS 7 修改主机名
  • Django 博客开发教程 16 - 统计文章阅读量
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • Java知识点总结(JavaIO-打印流)
  • leetcode-27. Remove Element
  • mac修复ab及siege安装
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • Python_网络编程
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 快速构建spring-cloud+sleuth+rabbit+ zipkin+es+kibana+grafana日志跟踪平台
  • 你不可错过的前端面试题(一)
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • 通过git安装npm私有模块
  • 用jquery写贪吃蛇
  • 自动记录MySQL慢查询快照脚本
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • 阿里云API、SDK和CLI应用实践方案
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • ###项目技术发展史
  • #NOIP 2014# day.1 生活大爆炸版 石头剪刀布
  • (附源码)spring boot北京冬奥会志愿者报名系统 毕业设计 150947
  • (附源码)ssm高校运动会管理系统 毕业设计 020419
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • *_zh_CN.properties 国际化资源文件 struts 防乱码等
  • .NET CORE使用Redis分布式锁续命(续期)问题
  • .NET 简介:跨平台、开源、高性能的开发平台
  • .net 设置默认首页
  • .NET 使用配置文件
  • .net 无限分类
  • .NetCore 如何动态路由
  • .net经典笔试题
  • /boot 内存空间不够
  • @column注解_MyBatis注解开发 -MyBatis(15)
  • [ 渗透工具篇 ] 一篇文章让你掌握神奇的shuize -- 信息收集自动化工具
  • [AX]AX2012 R2 出差申请和支出报告
  • [docker]docker网络-直接路由模式
  • [HDU 3555] Bomb [数位DP]
  • [HOW TO]怎么在iPhone程序中实现可多选可搜索按字母排序的联系人选择器