工作中用过几种知名的序列化协议,说说自己的感受吧,先独立讲各自的概念,然后比较下他们的优缺点。

JSON(Javascript Object Notation)
    官方网站是这样叙述的:一种轻量级的资料交换语言。易于人阅读和编写。同时也易于机器解析和生成。
json有两种结构:
1.名称/值,例如:
{
   "name"  : "xiaoming",
   "age"  :    12
}

你也可以再嵌套一层,例如:
{
   "name":
  {
     "first_name" : "xiao",
     "last_name" : "ming"
  },
   "age" :12
}

2.值的有序列表,例如:
{
   "week":
  [
     "monday",
     "tuesday"
  ]
}

也可以这样,例如
{
   "week":
  [                                                                                                                                        
    { "english""monday",   "chinese""星期一"},
    { "english""tuesday", "chinese""星期二"}
  ]
}

怎么样,是不是很直观,组合方式也很自由。所以很多文档型数据库都采用json作为存储结构;

     json提供对多种编程语言的支持,详见官网 http://www.json.org, 我使用过c++的libjson,注意操作时加上异常处理,否则约定错误时解析会导致程序崩溃, javascript更简单,直接加进json.js即可。

XML:(Extensible Markup Language)
    大名鼎鼎的xml语言,对于他只讲讲解析方式吧!

第一类是基于XML文档树结构的解析,如DOM(Document Object Model);
第二类是基于流式的解析,如SAX(Simple API for XML)、StAX(Stream API for XML)和XPP(XML Pull Parser);
第三类是基于非提取式的解析,例如VTD-XML(Virtual Token Description for XML)。

    这里有篇详细介绍这几种解析方式概念和适用场景的文章,讲述的很好,希望大家参阅 http://blog.csdn.net/liuhuang007/article/details/6252569

protobuf:
    google提供的一个开源序列化框架,官网是这样解释的“Protocol buffers are a flexible, efficient, automated mechanism for serializing structured data – think XML, but smaller, faster, and simpler. You define how you want your data to be structured once, then you can use special generated source code to easily write and read your structured data to and from a variety of data streams and using a variety of languages. You can even update your data structure without breaking deployed programs that are compiled against the "old" format.”

    总结一下特点:是基于二进制的,开发人员按照它提供的语法规则定义好消息格式,然后利用它提供好的编译工具自动生成相关的类,就可以很轻松的通过调用相关方法完成消息的序列化与反序列化。
具体如何使用请大家参考官方文档 http://code.google.com/intl/zh-CN/apis/protocolbuffers/docs/overview.html

结合自己的实践(c++语言)比较下三者:

序列化和反序列化的效率:protobuf高于json,json高于xml;

可读性:xml和json我觉得难分伯仲,但是他们都好于protobuf的二进制格式;

编码复杂度:xml高于json和protobuf,至于json和protobuf,流程上protobuf要复杂些,json只要引入相应的库就行了,而protobuf首先要按规则写消息结构,然后编译成相应的类。

适用场景:我认为xml比较适合与本地存储配置文件,而json和protobuf适合于进程间消息通讯或网络间消息通讯(注:soap是基于xml的,也许当时人们普遍认为xml是银弹吧)