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

测试结果:
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 { getset; }
    [ProtoMember(
2)]
    
public int PO { getset; }
    [ProtoMember(
3)]
    
public Address Address { getset; }
    [ProtoMember(
4)]
    
public Order Order { getset; }

    
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 { getset; }
    [ProtoMember(
2)]
    
public string City { getset; }
    [ProtoMember(
3)]
    
public string State { getset; }
    [ProtoMember(
4)]
    
public int Zip { getset; }
}

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

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


相关链接
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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/548952.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

运维的未来之路:在技术革命中保持关键地位

在快速发展的IT界&#xff0c;运维工程师向来扮演着无可或缺的角色。他们不仅确保系统的平稳运行&#xff0c;还需要及时应对突发事件&#xff0c;优化各项技术实施。然而&#xff0c;伴随着技术的迭代和新工具的出现&#xff0c;一些人开始担忧35岁成为运维人员的职业半衰期。…

Metrics_collector还没有添加到共享预加载库(shared_preload_libraries)中

gpcc踩坑 本文最大的锅&#xff0c;最大的坑来了 安装完成之后会报以下错误&#xff01;你可以完全忽略错误的解决过程直接跳到最后&#xff01; Metrics_collector还没有添加到共享预加载库(shared_preload_libraries)中。请添加它以启用指标收集。详见文档。 error alert …

Ogre读取中文路径名的文件失败的解决办法

Ogre的文件读取是使用的标准库的io库读取的&#xff0c;众所周知的是&#xff0c;在vs2005是存在着bug的。因此想要一劳永逸的解决这个办法唯有去修改Ogre的源代码&#xff0c;以下为修改方法&#xff1a;打开OgreFileSystem.cpp文件&#xff0c;找到FileSystemArchive::open方…

perl调用shell

1 systemperl也可以用system调用shell的命令,它和awk的system一样,返回值也是它调用的命令的退出状态.如果向system传递一个字符串作参数,则perl会调用shell来执行这个命令,在这个字符串内也就不可以有perl 的变量了;如果传递多个字符串作参数,则perl会自己执行这个命令,且可以…

硬盘类型的区分

硬盘接口类型的区分 1.IDE接口 IDE接口硬盘&#xff0c;IDE也称之为ATA接口&#xff0c;是一种比较老的接口硬盘&#xff0c;从刚开始生产至今&#xff0c;共推出了7个不同的版本&#xff0c;分别是&#xff1a;ATA-1 3.3MB/s、ATA-2 16.6MB/S、ATA-3 16.6MB/s、ATA-4 33MB/s…

Linux Software RAID的rebuild速度。

Linux Software RAID的rebuild速度是根据服务器负载情况自动调节的&#xff0c;默认的rebuild比较慢。默认的速度一般如下&#xff1a; [rootx003 ~]# sysctl dev.raid.speed_limit_min dev.raid.speed_limit_min 1000这个默认速度下&#xff0c;Rebuild一块1T的硬盘好好几天时…

bind配置文件解析

bind配置文件解析 bind作为一般的dns服务器的解析服务。 /etc/named.conf #bind的全局配置文件 /etc/named.rfc1912.zones #域配置文件 /var/named/ #存放zone&arpa文件 /var/log/messages #查看配置过程中出错信息 其中named.c…

硬盘结构

作者&#xff1a;Liuweifei 硬盘结构 1.硬盘结构 ​ 硬盘大致由盘片、读写头&#xff08;磁头&#xff09;、马达、底座、电路板等几大项组合而成。 ​ 硬盘的每一个盘片都有两个盘面&#xff0c;即上、下盘面。每个盘面都能利用&#xff0c;都可以存储数据&#xff0c;成为…

tomcat配置多站点

下面关于TOMCAT6.0配置多站点的问题怎么解决&#xff1f; [互联网 Windows ] 收藏 转发至天涯微博 悬赏点数 10 3个回答 夏洛叶 2009-02-08 09:26:30 在F:\Tomcat 6.0\conf\server.xml配置是这样的,想同时启动5个站点, <Host name"bbb" debug"0" appB…

认识和选购极致画质的显示器

作者&#xff1a;Liuweifei 认识和选购极致画质的显示器 显示器是电脑输出数据的主要硬件设备&#xff0c;它是一种电光转换工具&#xff0c;现在市面上的显示器都是LCD&#xff08;Liquid Crystal Display&#xff0c;液晶显示器&#xff09;显示器&#xff0c;它具有无辐射…

面向对象并不是必要的

程序开发并非一定要面向对象不可&#xff0c;面向对象是一种方式&#xff0c;但是不是唯一的方式&#xff0c;这种方式很多时候有用&#xff0c;不代表任何时候都是最高效的&#xff0c;更不是唯一的真理。面向对象将相关的状态属性和操作方法放在一个实体中&#xff0c;起到了…

认识和选购极致的显示器

作者&#xff1a;Liuweifei 3. 显示器面板的主流选择----IPS 显示器面板的类型关系着显示器的响应时间、色彩、可视角度、对比度等重要性能参数&#xff0c;显示器面板还占据了一台显示器成本70%左右&#xff0c;所以显示器面板对于显示器的优劣起着决定性的作用。现在市面上…

线程同步与异步套接字编程

1.利用事件对象来实现线程间的同步 新建一个win32 console application,取名Event,再建一个Event源文件&#xff0c;编辑&#xff1a; #include <iostream.h> #include <windows.h> DWORD WINAPI Fun1Proc(LPVOID lpParameter); DWORD WINAPI Fun2Proc(LPVOID lp…

电脑数据存储工具----光盘驱动器

作者&#xff1a;Liuweifei 电脑数据存储工具----光盘驱动器 光盘驱动器简称光驱&#xff0c;是电脑用来读写光盘内容的设备&#xff0c;也是在台式机和笔记本电脑里比较常见的一个硬件&#xff0c;随着移动存储设备的快速发展&#xff0c;光驱逐渐被其取代。 1. 光驱的类型…

认识和选购显卡

作者&#xff1a;Liuweifei 认识和选购显卡 显卡一般是一块独立的电路板&#xff0c;插在主板上接收由主机发出的控制显示系统工作的指令和显示内容的数字信号&#xff0c;然后通过输出模拟&#xff08;或数字&#xff09;信号控制显示器显示各种字符和图形&#xff0c;它和显…

11.04.30 半夜清晨

好一阵子没来blog了。 没错&#xff0c;间歇性迷茫。 期中考的缘故&#xff0c;两周没碰题。 最近又开始刷usaco&#xff0c;先恢复下手感脑感。 但是&#xff0c;真的是刷题无力。各种无力。 但是呢&#xff0c;哥是不会放弃的&#xff0c;这个不用怀疑。 院科协换届了&#x…

linux输入多行内容至文件

linux输入多行内容至文件 1. 单行写入 [rootcn01 test]# echo "192.168.1.1" >test.txt [rootcn01 test]# cat test.txt 192.168.1.12. 单行追加 [rootcn01 test]# echo "192.168.1.1" >>test.txt [rootcn01 test]# cat test.txt 192.168.1.…

PB-treeview基本属性事件函数

PB-treeview基本属性事件函数编程相关阅读271 评论0 字号&#xff1a;大中小 订阅 2010-11-04 13:43:34Label 项目的标识文字OverlayPictureIndex指定要使用的重叠图片的列表中的图片索引, 该图片显示在正常图片的上边StatePictureIndex 与状态图标列表中某个图标相对…

linux 之sed用法大全

linux 之sed用法大全 sed详细用法 1. sed的作用 sed是Stream Editor&#xff08;流编辑器&#xff09;的缩写&#xff0c;简称流编辑器&#xff1b;主要用来处理文本的。跟awk、grep合起来成为linux三驾马车。 sed是一行一行读取文件内容并按照要求进行处理&#xff0c;把处…

hadoop-0.21.0-eclipse-plugin无法在eclipse中运行解决方案

LINUX下将hadoop-0.21自带的hadoop eclipse plugin放到eclipse dropins目录中无法正常运行&#xff0c;使用eclipse -consolelog 发现找不到hadoop的类&#xff0c;解压hadoop-0.21.0-eclipse-plugin.jar发现META-INF下的MANIFEST.MF文 件中&#xff0c;Bundle-ClassPath写的有…