什么是ProtoBuf-net
Protobuf是google开源的一个项目,是基于二进制的类似于XML,JSON这样的数据表示语言,用户数据序列化反序列化,google声称google的数据通信都是用该序列化方法。它比xml格式要少的多,甚至比二进制数据格式也小的多。通过按照一定的语法定义结构化的消息格式,然后送给命令行工具,工具将自动生成相关的类,可以支持java、c++、python等语言环境。通过将这些类包含在项目中,可以很轻松的调用相关方法来完成业务消息的序列化与反序列化工作。
protobuf在google中是一个比较核心的基础库,作为分布式运算涉及到大量的不同业务消息的传递,如何高效简洁的表示、操作这些业务消息在google这样的大规模应用中是至关重要的。而protobuf这样的库正好是在效率、数据大小、易用性之间取得了很好的平衡。Protobuf格式协议和xml一样具有平台独立性,可以在不同平台间通信,通信所需资源很少,并可以扩展,可以旧的协议上添加新数据。
ProtoBuf-net应用
谷歌官方没有提供.net的实现,所以在nuget上找了一个移植的(Protobuf是在java和c++运行的,Protobuf-net当然就是Protobuf在.net环境下的移植。)
Nuget里搜索Protobuf-net,下载,自动添加到项目中
1.普通应用
using ProtoBuf; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Web; namespace WebApplication1 { public class ProtobufHelper { /// <summary> /// 序列化 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="t"></param> /// <returns></returns> public static string Serialize<T>(T t) { using (MemoryStream ms = new MemoryStream()) { Serializer.Serialize<T>(ms, t); return Encoding.UTF8.GetString(ms.ToArray()); } } /// <summary> /// 反序列化 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="content"></param> /// <returns></returns> public static T DeSerialize<T>(string content) { using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(content))) { T t = Serializer.Deserialize<T>(ms); return t; } } } }
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Runtime.Serialization; 5 using System.ServiceModel; 6 using System.ServiceModel.Activation; 7 using System.Text; 8 using ProtoBuf; 9 10 namespace WebApplication1 11 { 12 // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码、svc 和配置文件中的类名“Service1”。 13 // 注意: 为了启动 WCF 测试客户端以测试此服务,请在解决方案资源管理器中选择 Service1.svc 或 Service1.svc.cs,然后开始调试。 14 [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 15 public class Service1 : IService1 16 { 17 18 public string DoWork() 19 { 20 UserInfo u1 = new UserInfo(); 21 u1.Name = "张三"; 22 u1.Age = 48; 23 u1.Address = "北京"; 24 UserInfo u2 = new UserInfo(); 25 u2.Name = "李四"; 26 u2.Age = 21; 27 u2.Address = "天津"; 28 List<UserInfo> us = new List<UserInfo>() { u1, u2 }; 29 string serStr = ProtobufHelper.Serialize(us); 30 // List<UserInfo> s = ProtobufHelper.DeSerialize<List<UserInfo>>(serStr); 31 return serStr; 32 } 33 } 34 35 [ServiceContract] 36 public interface IService1 37 { 38 [OperationContract] 39 [System.EnterpriseServices.Description("测试")] 40 string DoWork(); 41 } 42 43 [ProtoContract] 44 public class UserInfo 45 { 46 [ProtoMember(1)] 47 public string Name { get; set; } 48 49 [ProtoMember(2)] 50 public int Age { get; set; } 51 52 [ProtoMember(3)] 53 public string Address { get; set; } 54 } 55 }
2.WCF应用