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





  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Protocol Buffer是一种语言无关、平台无关、可扩展的序列化机制,它可以用于在不同的应用程序间进行数据传输和存储。要将Protocol Buffer架设服务器并接入Unity,可以按照以下步骤进行操作: 1. 首先,需要在服务器端设置一个网络监听服务,用于接收客户端(Unity)的请求。可以使用常见的网络编程框架,如Python的Twisted、Java的Netty或C#的.Net Socket等。 2. 为了在服务器与客户端之间进行数据传输,需要创建一个共享的Protocol Buffer消息定义文件(.proto文件)。该文件应该能够描述服务器和客户端之间通信的数据结构和消息格式。 3. 在服务器端,根据之前定义的.proto文件,使用Protocol Buffer编译器生成相应的代码(如C#、Java或Python),以便在服务器端进行数据的序列化和反序列化。 4. 在服务器端的代码中,通过网络监听服务接收到来自Unity客户端的数据。将这些数据反序列化为Protocol Buffer消息,进行服务器端的逻辑处理,并根据需要对数据进行处理(如存储到数据库、发送给其他客户端等)。 5. 在Unity中,同样需要使用Protocol Buffer编译器生成相应的代码(如C#),以便在Unity客户端进行数据的序列化和反序列化。 6. 在Unity中,可以根据需要创建消息对象,将这些对象序列化为Protocol Buffer消息,并通过网络连接向服务器发送数据。 7. 在Unity中,可以使用网络库(如UnityWebRequest)来接收服务器返回的数据。将接收到的数据反序列化为Protocol Buffer消息,在Unity客户端中进行处理和展示。 总结起来,要将Protocol Buffer架设服务器并接入Unity,主要的步骤包括设置服务器的网络监听服务、定义共享的Protocol Buffer消息格式、在服务器和Unity中生成相应的Protocol Buffer代码、进行数据的序列化和反序列化操作,以实现服务器与Unity客户端之间的数据传输和通信。 ### 回答2: 要在Unity中接入Protocol Buffer架设服务器,你可以按照以下步骤进行操作: 1. 首先,你需要安装Protocol Buffer的插件和库。你可以在Protocol Buffer的官方网站上下载并安装适用于你使用的操作系统的插件。 2. 在Unity中创建一个新的脚本来处理与服务器之间的通信。你可以使用Unity提供的网络功能(如 WebClient、HttpWebRequest 等)或者使用第三方库来处理网络通信。 3. 在你的Unity项目中创建一个.proto文件,该文件定义了你与服务器之间的数据通信格式。你可以使用Protocol Buffer的语法来定义消息和服务。 4. 使用Protocol Buffer的编译器将.proto文件编译成适用于C#的类。编译器会生成相应的C#类用于序列化和反序列化数据。 5. 在服务器端,你需要使用Protocol Buffer的库来处理从Unity发送过来的请求和响应。你可以使用适用于你的服务器端语言的库来处理。 6. 在Unity中,你可以使用C#生成的类来编码和解码Protocol Buffer消息。你可以将数据从Unity发送到服务器,并将服务器的响应数据解析回Unity中进行处理。 7. 最后,你可以在Unity中使用接收到的数据进行游戏逻辑处理,例如更新游戏状态、显示信息等。 总之,通过以上步骤,你可以在Unity中使用Protocol Buffer架设服务器,并且通过定义好的消息格式进行通信。这样,你就能够实现与服务器的数据交互和游戏逻辑处理。 ### 回答3: 要在Unity中接入Protocol Buffer(PB)架设的服务器,需要进行以下步骤: 1. 首先,确保已安装Protocol Buffer编译器(protoc)和相关的插件。可以从Protocol Buffer官方网站下载适用于所需平台的编译器和插件。 2. 在服务器端,使用Protocol Buffer定义文件(.proto文件)定义数据结构和通信协议。在该文件中,声明消息类型、字段和可选的选项。使用Protocol Buffer的语法为服务器和客户端定义相同的消息类型。 3. 使用protoc编译器将.proto文件编译成相应语言的文件(如C#)生成代码。 4. 在服务器端,使用编译生成的代码实现服务。服务器端应用程序可以使用Socket或其他网络通信库来实现网络连接和消息传输。将编码的PB消息从服务器发送到Unity客户端。 5. 在Unity中,与服务器进行通信的客户端代码中,也需要使用相同的.proto文件来生成相应的PB消息类。将从服务器接收到的编码消息解码成PB消息对象。 6. 在Unity中,可以使用解码后的PB消息对象进行相关逻辑的处理。根据接收到的消息类型,执行相应的操作。 7. 在Unity中,将需要发送给服务器的消息编码成PB消息对象,并通过网络发送给服务器。 通过以上步骤,就可以在Unity中接入Protocol Buffer架设的服务器,并进行数据的传输和处理。请注意,需要确保服务器和Unity客户端使用的是相同的.proto文件和相应生成的PB代码,以便正确解析和处理消息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值