这篇文章主要讲述xml与对象的序列化与反序列化。并且会附上一些简单的序列化与反序列化方法,供大家使用。
假设我们在一个web项目中有这样两个类
复制代码 代码如下:
public class member
{
public string num { get; set; }
public string name { get; set; }
}
public class team
{
public string name;
public list
}
假设我们需要把team类的一个实例post到一个url,
当然,使用form隐藏域提交就可以完成该功能。
如果该team包括30条数据呢?
为了区分每个member,我们得给参数的名字加上后缀。这就要一大串的隐藏域来完成:
复制代码 代码如下:
@model team
<script type="text/javascript"><br> document.getelementbyid("submitform").submit();<br></script>
还敢想象一下如果team再复杂一些,嵌套再多一些的情况么?
呃,即使你愿意这么传数据,对方看到一坨参数名就够头疼了。
我们都知道对象是不能在网络中直接传输的,不过还有补救的办法。
xml(extensible markup language)可扩展标记语言,本身就被设计用来存储数据,任何一个对象都可以用xml来描述。以team类为例:
复制代码 代码如下:
这样一个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
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文档了。
复制代码 代码如下:
与我在文章开头给出的例子是一模一样的。
最终反序列化出来的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
}
然后我们再次执行刚才的控制台程序,序列化结果变成了这样:
复制代码 代码如下:
本来的根节点team变成了our_team,member的子节点num变成了member_num,并且team的name子节点被忽略了。
可见特性xmlroot可以控制根节点的显示和操作过程,xmlelement则针对子节点。如果某些成员被标记xmlignore,则在序列化与反序列化过程中会被忽略。
这些特性的具体内容可以在msdn查看,就不多讲了。
有了这些知识,在网络中传递对象数据应该已经难不倒各位看官了把。^_^
0
0
相关文章
php怎么调用SOAP接口_php使用SoapClient访问Web服务【协议】
PHP 中使用 DOM 扩展在任意深度文本节点中查找并包裹指定字符串
php怎么生成sitemap网站地图_php自动创建XML站点地图【SEO】
PHP请求网址返回XML怎解析_PHPXML解析法【提取】
PHP过低怎样在cPanel升级_PHP过低cPanel升级流程【面板】
本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门AI工具
相关专题
《Golang 生态工具与框架》系统梳理 Go 语言在实际工程中的主流工具链与框架选型思路,涵盖 Web 框架、RPC 通信、依赖管理、测试工具、代码生成与项目结构设计等内容。通过真实项目场景解析不同工具的适用边界与组合方式,帮助开发者构建高效、可维护的 Go 工程体系,并提升团队协作与交付效率。
1
2026.02.24
《Golang 性能优化专题》聚焦 Go 应用在高并发与大规模服务中的性能问题,从 profiling、内存分配、Goroutine 调度、GC 机制到 I/O 与锁竞争逐层分析。结合真实案例讲解定位瓶颈的方法与优化策略,帮助开发者建立系统化性能调优思维,在保证代码可维护性的同时显著提升服务吞吐与稳定性。
2
2026.02.24
Golang 面试题精选》系统整理企业常见 Go 技术面试问题,覆盖语言基础、并发模型、内存与调度机制、网络编程、工程实践与性能优化等核心知识点。每道题不仅给出答案,还拆解背后的设计原理与考察思路,帮助读者建立完整知识结构,在面试与实际开发中都能更从容应对复杂问题。
1
2026.02.24
《Golang 运行与部署实战》围绕 Go 应用从开发完成到稳定上线的完整流程展开,系统讲解编译构建、环境配置、日志与配置管理、容器化部署以及常见运维问题处理。结合真实项目场景,拆解自动化构建与持续部署思路,帮助开发者建立可靠的发布流程,提升服务稳定性与可维护性。
3
2026.02.24
《Golang 疑难杂症解决指南》聚焦开发过程中常见却棘手的问题,从并发模型、内存管理、性能瓶颈到工程化实践逐步拆解。通过真实案例与调试思路,帮助开发者定位问题根因,建立系统化排查方法。不只给出答案,更强调分析路径与工具使用,让你在复杂 Go 项目中具备持续解决问题的能力。
1
2026.02.24
Golang 入门路线涵盖从零到上手的核心路径:首先打牢基础语法与切片等底层机制;随后攻克 Go 的灵魂——接口设计与 Goroutine 并发模型;接着通过 Gin 框架与 GORM 深入 Web 开发实战;最后在微服务与云原生工具开发中进阶,旨在培养具备高性能并发处理能力的后端工程师。
0
2026.02.24
本专题汇总苹果官网最新可用入口及中国站点访问方式,涵盖官网直达链接、iPhone官方页面查看方法与常见访问说明,帮助用户快速进入苹果官方网站,便捷了解产品信息与官方服务。
14
2026.02.24
本专题系统整理Asianfanfics(AFF)官方网站最新可用入口,涵盖官方平台最新直达地址、官网登录方式及中文访问指引,帮助用户快速、安全地进入AFF平台浏览与使用相关内容。
15
2026.02.24
热门下载
相关下载
最新文章


