测试结果:
ProtoBuf Length:115
BinaryFormatter Length:1177
XmlSerializer Length:814
xml length:825
做了一个各种序列化方案的压缩比例测试,可以看到protobuf序列化后的大小是xml原始格式的8分之一,是xml序列化后的8分之一,是二进制序列化的10分之一,总体看来ProtoBuf的优势还是很明显的,不过ProtoBuf.net不是google官方提供的,也许和其它平台不兼容,但如果做.NET服务端应用,两边都是.NET,还是可以适用的,即使有一边不是.NET,反正是开源的东西,协议也有,也可以自己实现相应语言的兼容ProtoBuf.net的协议栈。
SOAPFormatter没有测试,一般用的不多。还有就是怪事了,为什么二进制序列化反而大呢,奇怪了。
本次测试主要考虑协议的压缩率的比较,不考虑序列化/解序列化的速度,官方声明比XML解析要快几十倍,有空看下它的实现代码,我的SVN老下载不下来code.google的代码,汗了。

测试代码如下

internal class Program
{
    private static void Main(string[] args)
    {
        MemoryStream ms = null;
        Customer customer = Customer.GetOneCustomer();

using (ms = new MemoryStream())
        {
            Serializer.Serialize(ms, customer);
            Console.WriteLine("ProtoBuf Length:{0}", ms.Length);
        }
        using (ms = new MemoryStream())
        {
            var formater = new BinaryFormatter();
            formater.Serialize(ms, customer);
            Console.WriteLine("BinaryFormatter Length:{0}", ms.Length);
        }
        using (ms = new MemoryStream())
        {
            var serializer = new XmlSerializer(typeof (Customer));
            serializer.Serialize(ms, customer);
            Console.WriteLine("XmlSerializer Length:{0}", ms.Length);
        }

string xml =
            @"<?xml version=""1.0"" ?>
 <Customer xmlns=""urn:Sep2003Example"">
<CustomerID>ALFKI</CustomerID>
<PO>9572658</PO>
<Address>
    <Street>One Main Street</Street>
    <City>Anywhere</City>
    <State>NJ</State>
    <Zip>08080</Zip>
</Address>
<Order>
    <OrderID>10966</OrderID >
    <LineItem>
        <ProductID>37</ProductID>
        <UnitPrice>26.50 </UnitPrice>
        <Quantity>8</Quantity>
        <Description>Gravad lax </Description>             
    </LineItem>
    <LineItem>
        <ProductID>56 </ProductID>
        <UnitPrice>38.00</UnitPrice>
        <Quantity>12</Quantity>
        <Description>Gnocchi di nonna Alice</Description>             
    </LineItem>
</Order>     
</Customer>";
        Console.WriteLine("xml length:{0}", Encoding.UTF8.GetByteCount(xml));
        Console.ReadKey();
    }
}


相关数据结构如下

[ProtoContract]
[Serializable]
public class Customer {
    [ProtoMember(1)]
    public string CustomerID { get; set; }
    [ProtoMember(2)]
    public int PO { get; set; }
    [ProtoMember(3)]
    public Address Address { get; set; }
    [ProtoMember(4)]
    public Order Order { get; set; }

public static Customer GetOneCustomer() {
        Customer customer = new Customer {
            CustomerID = "ALFKI",
            PO = 9572658,
            Address = new Address {
                Street = "One Main Street",
                City = "Anywhere",
                State = "NJ",
                Zip = 08080
            },
            Order = new Order {
                OrderID = 10966,
                LineItems = new List<LineItem>
                    {
                        new LineItem
                            {
                                ProductID = 37,
                                UnitPrice = 26.50M,
                                Quantity =8,
                                Description ="Gravad lax"
                            },
                        new LineItem
                            {
                                ProductID = 56,
                                UnitPrice = 38.00M,
                                Quantity =12,
                                Description ="Gnocchi di nonna Alice"    
                            }
                    }
            }
        };
        return customer;
    }
}

[ProtoContract]
[Serializable]
public class Address {
    [ProtoMember(1)]
    public string Street { get; set; }
    [ProtoMember(2)]
    public string City { get; set; }
    [ProtoMember(3)]
    public string State { get; set; }
    [ProtoMember(4)]
    public int Zip { get; set; }
}

[ProtoContract]
[Serializable]
public class Order {
    [ProtoMember(1)]
    public int OrderID { get; set; }
    [ProtoMember(2)]
    public List<LineItem> LineItems { get; set; }
}

[ProtoContract]
[Serializable]
public class LineItem {
    [ProtoMember(1)]
    public int ProductID { get; set; }
    [ProtoMember(2)]
    public decimal UnitPrice { get; set; }
    [ProtoMember(3)]
    public int Quantity { get; set; }
    [ProtoMember(4)]
    public string Description { get; set; }
}

相关链接
Protocol Buffers 性能测试
http://hellobmw.com/archives/protocol-buffers-performance.html
Windows Communication Protocols (MCPP)
http://msdn.microsoft.com/en-us/library/cc216513(PROT.10).aspx
浅谈如何使用.NET存储XML数据
http://developer.51cto.com/art/200905/122238.htm
.net下二进制序列化的格式分析[转]
http://www.cnblogs.com/lxinxuan/archive/2006/09/06/496340.html
Protocol Buffers Encoding
http://code.google.com/intl/zh-CN/apis/protocolbuffers/docs/encoding.html

net自带二进制序列化,XML序列化和ProtoBuf序列化的压缩对比相关推荐

  1. 【Java从0到架构师】分布式框架通信核心基础 - 序列化(JDK、Protobuf)、远程过程调用 RMI

    分布式框架通信核心基础 序列化 JDK 的序列化 JDK 序列化的一些细节 Protobuf 序列化 Protobuf 环境搭建与操作 Protobuf 原理分析 实际数据传输 序列化技术选型 远程过 ...

  2. Android -- 创建XML文件对象及其序列化, pull解析XML文件

    1. 创建XML文件对象及其序列化 示例代码:(模拟以xml格式备份短信到SD卡) SmsInfo.java, bean对象 /*** 短信的业务bean* @author Administrator ...

  3. 一文带你全面了解java对象的序列化和反序列化

    本文分享自华为云社区<java中什么是序列化和反序列化?>,原文作者:dayu_dls . 这篇文章主要给大家介绍了关于java中对象的序列化与反序列化的相关内容,文中通过详细示例代码介绍 ...

  4. android之XmlSerializer序列化XML(写入) android之XmlSerializer序列化XML(写入)...

    android之XmlSerializer序列化XML(写入) 分类:android_数据增删查改2011-03-03 11:497437人阅读评论(2)收藏举报 androidxmlstringen ...

  5. 什么是java序列化_什么是Java序列化?为什么序列化?序列化有哪些方式?

    先普及一下,计算机中无法识别一个基本单元[字节]来表示,必须经过"翻译"才能让计算机理解人类的语言,这个翻译过程就是[编码],通常所说的字符转换为字节. ?有I/O的地方机就会涉及 ...

  6. 【Android Protobuf 序列化】Protobuf 简介 ( Protobuf 项目简介 | Protobuf 优缺点分析 )

    文章目录 一.Protobuf 简介 二.Protobuf 优缺点分析 1.Protobuf 优点 2.Protobuf 缺点 三.参考资料 一.Protobuf 简介 Protobuf 是 Goog ...

  7. python封装函数、实现将任意的对象序列化到磁盘上_序列化(serialization)

    序列化是指将"结构化数据"转换成"可存储格式"的过程,逆向转换过程被称为逆序列化. 比如在 Python 中,结构化数据对象 dict 并不能直接存储到文件中: ...

  8. Go语言 ProtoBuf 序列化和反序列化

    前言 Protobuf 是Google开发的一个网络通信协议,提供了高效率的序列化和反序列化机制,序列化就是把对象转换成二进制数据发送给服务端,反序列化就是将收到的二进制数据转换成对应的对象.官方版本 ...

  9. 高效的序列化/反序列化数据方式 Protobuf

    高效的序列化/反序列化数据方式 Protobuf github地址 目录 protocolBuffers 序列化 Int32 String Map slice 序列化小结 protocolBuffer ...

最新文章

  1. SimpleDateFormat线程不安全
  2. 黑马程序员_java之集合框架
  3. python小程序-整理了适合新手的20个Python练手小程序
  4. [转]Angular 单元测试讲解
  5. 制作oracle11g yum源,利用安装盘简单制作yum源
  6. visio网络拓扑图_人才测评模型是什么?5步了解好看模型图
  7. Python 基础 —— time(时间,日期)
  8. 手摸手写一个互联网黑话生成器
  9. Java基础3-循环
  10. 在windows中使用bat脚本获取linux服务器文件
  11. 美团/饿了么外卖CPS联盟返利公众号小程序核心源码代码
  12. chrome 未连接到互联网 代理服务器出现问题,或者地址有误
  13. AsyncTask下载网络文件,并显示下载进度
  14. Android SELinux开发入门指南之如何增加Java Binder Service权限
  15. 【读书笔记】《中庸(国学大书院)》
  16. 视频剪辑工具,教你批量分割视频并提取原音频单独保存
  17. 使用Acrobat时,怎样使其默认页面显示方式为启用滚动
  18. 直流电动机的平衡方程式
  19. DICOM-RT struct使用python脚本转换为nii.gz
  20. jQuery国际电话区号选择插件intlTelInput.js

热门文章

  1. php无嵌套遍历多维数组,不递归怎么遍历多维数组(维数不定)
  2. 高斯课堂数电讲义笔记_学技树
  3. python3缺少pip_Ubuntu中找不到pip3命令的解决方法
  4. 《团队激励与沟通》第 1 讲——激励理论 重点部分总结
  5. vue 点击li 中的img 怎么不冒泡_Vue全解
  6. helm安装postgres_Helm 入门介绍 Kubernetes 上的包管理软件
  7. mac php命令行模式,phpstorm分别在Mac和Windows下启动命令行,并启用ssh
  8. php sql取数据生成数组中,php中实现数组生成要执行的sql语句
  9. 计算机组成原理单周期mips,计算机组成原理CPU单周期数据通路(MIPS)
  10. js 控制鼠标_JS逆向 | 面向小白之eval混淆