.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 {  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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值