0

0

深入理解:XML与对象的序列化与反序列化_PHP

php中文网

php中文网

发布时间:2016-06-01 12:06:22

|

1363人浏览过

|

来源于php中文网

原创

这篇文章主要讲述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





...




<script type="text/javascript"><br>    document.getelementbyid("submitform").submit();<br></script>

还敢想象一下如果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查看,就不多讲了。
有了这些知识,在网络中传递对象数据应该已经难不倒各位看官了把。^_^

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Golang 生态工具与框架:扩展开发能力
Golang 生态工具与框架:扩展开发能力

《Golang 生态工具与框架》系统梳理 Go 语言在实际工程中的主流工具链与框架选型思路,涵盖 Web 框架、RPC 通信、依赖管理、测试工具、代码生成与项目结构设计等内容。通过真实项目场景解析不同工具的适用边界与组合方式,帮助开发者构建高效、可维护的 Go 工程体系,并提升团队协作与交付效率。

1

2026.02.24

Golang 性能优化专题:提升应用效率
Golang 性能优化专题:提升应用效率

《Golang 性能优化专题》聚焦 Go 应用在高并发与大规模服务中的性能问题,从 profiling、内存分配、Goroutine 调度、GC 机制到 I/O 与锁竞争逐层分析。结合真实案例讲解定位瓶颈的方法与优化策略,帮助开发者建立系统化性能调优思维,在保证代码可维护性的同时显著提升服务吞吐与稳定性。

2

2026.02.24

Golang 面试题精选:高频问题与解答
Golang 面试题精选:高频问题与解答

Golang 面试题精选》系统整理企业常见 Go 技术面试问题,覆盖语言基础、并发模型、内存与调度机制、网络编程、工程实践与性能优化等核心知识点。每道题不仅给出答案,还拆解背后的设计原理与考察思路,帮助读者建立完整知识结构,在面试与实际开发中都能更从容应对复杂问题。

1

2026.02.24

Golang 运行与部署实战:从本地到云端
Golang 运行与部署实战:从本地到云端

《Golang 运行与部署实战》围绕 Go 应用从开发完成到稳定上线的完整流程展开,系统讲解编译构建、环境配置、日志与配置管理、容器化部署以及常见运维问题处理。结合真实项目场景,拆解自动化构建与持续部署思路,帮助开发者建立可靠的发布流程,提升服务稳定性与可维护性。

3

2026.02.24

Golang 疑难杂症解决指南:常见问题排查与优化
Golang 疑难杂症解决指南:常见问题排查与优化

《Golang 疑难杂症解决指南》聚焦开发过程中常见却棘手的问题,从并发模型、内存管理、性能瓶颈到工程化实践逐步拆解。通过真实案例与调试思路,帮助开发者定位问题根因,建立系统化排查方法。不只给出答案,更强调分析路径与工具使用,让你在复杂 Go 项目中具备持续解决问题的能力。

1

2026.02.24

Golang 入门学习路线:从零基础到上手开发
Golang 入门学习路线:从零基础到上手开发

Golang 入门路线涵盖从零到上手的核心路径:首先打牢基础语法与切片等底层机制;随后攻克 Go 的灵魂——接口设计与 Goroutine 并发模型;接着通过 Gin 框架与 GORM 深入 Web 开发实战;最后在微服务与云原生工具开发中进阶,旨在培养具备高性能并发处理能力的后端工程师。

0

2026.02.24

中国研究生招生信息网官方网站入口 研招网网页版在线入口
中国研究生招生信息网官方网站入口 研招网网页版在线入口

中国研究生招生信息网入口(https://yz.chsi.com.cn) 此网站是研究生报名入口的唯一官方网站

95

2026.02.24

苹果官网入口与在线访问指南_中国站点快速直达与iPhone查看方法
苹果官网入口与在线访问指南_中国站点快速直达与iPhone查看方法

本专题汇总苹果官网最新可用入口及中国站点访问方式,涵盖官网直达链接、iPhone官方页面查看方法与常见访问说明,帮助用户快速进入苹果官方网站,便捷了解产品信息与官方服务。

14

2026.02.24

Asianfanfics官网入口与访问指南_AFF官方平台最新登录地址
Asianfanfics官网入口与访问指南_AFF官方平台最新登录地址

本专题系统整理Asianfanfics(AFF)官方网站最新可用入口,涵盖官方平台最新直达地址、官网登录方式及中文访问指引,帮助用户快速、安全地进入AFF平台浏览与使用相关内容。

15

2026.02.24

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
XML教程
XML教程

共142课时 | 7.5万人学习

XQuery 教程
XQuery 教程

共12课时 | 4.2万人学习

XLink  教程
XLink 教程

共7课时 | 1.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号