zoukankan      html  css  js  c++  java
  • .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

  • 相关阅读:
    [算法初步]希尔排序
    逆波兰表达式1(简介)
    [数据结构]之链表
    [数据结构]之栈
    [算法初步]之归并排序
    [算法初步]之快速排序
    [算法初步]之冒泡排序
    逆波兰表达式2中缀转后缀表达式)
    [算法初步]之简单选择排序
    [数据结构]之顺序表
  • 原文地址:https://www.cnblogs.com/onlytiancai/p/protobuf_net_test.html
Copyright © 2011-2022 走看看