先上两张图,表达一下为什么用这个
数据来源:https://maxondev.com/serialization-performance-comparison-c-net-formats-frameworks-xmldatacontractserializer-xmlserializer-binaryformatter-json-newtonsoft-servicestack-text/
我的服务端是使用serviceStack建立的
首先声明一个request对象。
特性加上 [ProtoContract] 这个需要引用protobuf-netdll
[Route("/hello/{Name}")]
[ProtoContract]
public class Hello : IReturn<HelloResponse>
{
[ProtoMember(1)]
public string Name { get; set; }
}
[ProtoContract]
public class HelloResponse
{
[ProtoMember(1)]
public string Result { get; set; }
}
找到Apphost这个类
引用ServiceStack.ProtoBuf,
public class AppHost : AppHostBase
{
public AppHost()
: base("testServiceStack0913", typeof(MyServices).Assembly) {
}
public override void Configure(Container container)
{
this.Plugins.Add(new ProtoBufFormat());//注册protobuff消息格式
}
}
接口的请求代码部分与其他一样,比如以下代码
public object Any(Hello request)
{
return new HelloResponse { Result = "Hello, {0}!".Fmt(request.Name) };
}
这时候,你的服务端hello方法就支持protobuff请求了
---------------------------------------------------------------------------
接着发布你的应用程序
-------------------------------------------------------------------------
发完之后,下面举个调用案例方法
首先声明request实体类and response实体类,与服务端类似.
1. 使用ProtoBufServiceClient调用
var client = new ProtoBufServiceClient(BaseUri);
var repone = client.Post<HelloResponse>(new Hello { Name = "ProtoBuf" });//这个是post请求
var repone = client.Get<HelloResponse>(new Hello { Name = "ProtoBuf" });//这个是Get请求
2.使用http请求
需要应用序列化dll, protobuf-net
public static HelloResponse HttpGet(string Url)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
request.Method = "GET";
request.ContentType = "application/x-protobuf";
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream myResponseStream = response.GetResponseStream();
var HelloResponse = Serializer.Deserialize<HelloResponse>(myResponseStream);
return HelloResponse;
}
public static T Post<T>(string url, object json, IDictionary<string, string> heads = null, string charset = "utf-8")
{
try
{
var request = System.Net.HttpWebRequest.Create(url) as System.Net.HttpWebRequest;
request.Method = "POST";
//添加http标头 用于验证
if (heads != null)
{
foreach (var key in heads.Keys)
{
request.Headers.Add(key, heads[key]);
}
}
// 设置请求的参数形式
request.ContentType = string.Format("application/x-protobuf");
byte[] data;
int len;
using (var stream = new MemoryStream())
{
Serializer.Serialize(stream, json);
data = stream.GetBuffer(); //使用protobuff 进行序列化
len = (int)stream.Length;
}
request.ContentLength = len;
using (var stream = request.GetRequestStream())
{
stream.Write(data, 0, len);
}
// GetResponse 方法才真的发送请求,等待服务器返回
var response = (System.Net.HttpWebResponse)request.GetResponse();
// 然后可以得到以流的形式表示的回应内容
var receiveStream = response.GetResponseStream();
T HelloResponse = Serializer.Deserialize<T>(receiveStream);
//完成后要关闭字符流,字符流底层的字节流将会自动关闭
response.Close();
return HelloResponse;
}
catch (Exception ex)
{
return default(T);
}
}
结束: 本文只是简单的使用介绍。
具体文档:https://developers.google.com/protocol-buffers/docs/csharptutorial
具体代码:https://github.com/ServiceStack/ServiceStack/tree/master/src/ServiceStack.ProtoBuf