C# 下使用Protocol Buffer样例。

先上两张图,表达一下为什么用这个



数据来源: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





展开阅读全文

没有更多推荐了,返回首页