.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的代碼,汗了。
測試代碼如下
{
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();
}
}
相關數據結構如下
[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.rzrgm.cn/lxinxuan/archive/2006/09/06/496340.html
Protocol Buffers Encoding
http://code.google.com/intl/zh-CN/apis/protocolbuffers/docs/encoding.html

浙公網安備 33010602011771號