前言

Protocol Buffers (下面简称PB)是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,很适合做数据存储或 RPC 数据交换格式。它可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。它支持多种语言,比如C++,Java,C#,Python,JavaScript等等。目前它的最新版本是3.0.0。与PB经常相提并论的也是Google推出的FlatBuffers(下面简称FB)。有关PB和FB性能和语义等方面的区别,这里就不展开描述了。如果有兴趣,可以参阅下面的信息:

目前很多公司在一些高性能的通信场景下,会越来越多的选择用PB或者FB来替代我们常用的Json。比如说Windows Phone的微信的SDK就用到了。

反编译微信SDK

PB对C#官方的支持是从3.0开始的,之前的1.0和2.0的版本都能找到一些非官方的版本。我们先反编译一下微信的SDK,看下它具体是什么版本的。

首先,我们从微信的官网下载SDK:

登陆微信开发平台,进入资源中心,选择WP8资源下载,点击下载。

然后下载我们的反编译工具ILSpy

解压下载完成的ILSpy和SDK包,用ILSpy.exe打开MicroMsgSDK.dll。

我们暂时先不管这个结构到底是怎么来的,我们可以看到反编译出来的文件带了ProtoGen的版本号,我们尝试从Github上找到这个版本号的代码。

编译ProtoBuffer源码

我们先打开官方的C#版本的PB的源码页面:地址

可以看到官方地址只保留了3.0的版本,对于旧的2.0版本的代码在jskeet的账号下,

我们点开这个仓库,然后找到它的Release页面:

我们找到2.3.0.277的源码并下载到本地。

解压文件,我们看到Build文件夹下有一堆编译用的脚本:

双击运行buildAll.bat(此处应确保本机已经安装了Visual Studio 2008及以上版本),然后等待编译完成。

尝试使用源码中的Proto文件生成cs代码

我们找到ProtoGen项目中生成的exe文件,尝试将它放到命令行中运行:

它提示我们找不到protoc.exe程序。我们回到源码的根目录会发现有一个lib的文件夹,里面有一个protoc.exe的程序。所以我们尝试吧ProtoGen项目的所有生成文件拷贝到lib下。

继续尝试运行我们的ProtoGen程序。

这回对了,我们尝试把源码下的protos文件夹下的三个子文件夹拷贝到我们的lib目录下。

我们尝试输入如下内容:

protogen --proto_path==protos protos/tutorial/addressbook.proto

又得到一个错误信息:

提示我们找不到依赖,我们尝试打开proto文件:(有关PB的语法请参阅:http://www.cnblogs.com/stephen-liu74/archive/2013/01/02/2841485.html)

package tutorial;

import "google/protobuf/csharp_options.proto";

option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.Examples.AddressBook";
option (google.protobuf.csharp_file_options).umbrella_classname = "AddressBookProtos"; option optimize_for = SPEED; message Person {
required string name = 1;
required int32 id = 2; // Unique ID number for this person.
optional string email = 3; enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
} message PhoneNumber {
required string number = 1;
optional PhoneType type = 2 [default = HOME];
} repeated PhoneNumber phone = 4;
} // Our address book file is just one of these.
message AddressBook {
repeated Person person = 1;
}

我们可以看到导入了google/protobuf/csharp_options.proto文件,我们回头看protogen的命令参数中有一个import的标记,我们尝试添加:

protogen --proto_path==protos protos/tutorial/addressbook.proto --include_imports=google/protobuf/csharp_options.proto

没有任何错误,并且我们在lib的目录下发现了生成的cs文件。

从cs文件反推proto文件

我们打开AddressBookProtos文件,阅读源码发现:

  • 只有两个非静态类,与我们Proto文件中的Person和AddressBook对应:

  • Person类中又有一个嵌套的枚举和类,与PhoneType和PhoneNumber对应:

  • 我们有发现,在类的IsInitialized中,Name和Id等required的有是否有值得判断,所以我们能区分去required和optional

其他依赖信息,我们可以通过引用来查找。

从反编译的微信文件中反推proto文件

我们以BaseReqP为例。首先,没有using,所以我们确定没有其他的Proto文件的依赖。我们只发现一个类,所以说明它只有一条message,名称就是BaseReqP,然后包名是MicroMsg.sdk.protobuf。

我们知道message的所有字段是需要标记数字的:

从这里我们又反推出,message有两个字段:Transaction和Type,它们类型分别是string和uint。

接下来我们推是否是必须的。找到我们的IsInitialized:



从这里我们就知道了两个字段都是必须的。所以综合上述信息,我们可以写出的proto文件如下:

package MicroMsg.sdk.protobuf;

message BaseReqP {
required uint32 Type = 1;
required string Transaction = 2;
}

小结

本篇内容简要介绍了ProtoBuffer的文件如何生成C#文件,并简单的举例如何从C#文件反推Proto文件。

参考信息

从微信SDK看ProtoBuffer文件的生成的更多相关文章

  1. 【Win10 UWP】微信SDK基本使用方法和基本原理

    上回讲到,作为一个长期散播温暖,散播希望的小清新无公害WP开发者,继QQ SDK之后,又把UWP微信SDK这茬了结了,仅供学习交流. 1.安装微信SDK for UWP 微信官方此前明确说明短时间内暂 ...

  2. 微信公众平台开发,图文回复、access_token生成调用、以及微信SDK的实现(2)

    上一节课,我给大家分享了微信API接入以及事件推送的回复,这是微信开发的第二节课,重点给说一说单图文回复,多图文回复,access_token,微信SDK. 公众号消息回复很多种形式,常见的形式有,文 ...

  3. Xamarin绑定微信SDK 实现分享功能

    从开始做这一块的工作开始,就开始找各种的资料,最后还是老老实实的去看官方文档. 对于Xamarin.Android的绑定属于纯jar的绑定,这个难度较小,添加Bindings Library,将lib ...

  4. iOS-不用微信SDK唤起微信支付

    作者:TianBai 原文链接:http://www.jianshu.com/p/8930b4496023 要想知道微信SDK是如何调起微信客户端,那么咱们先看看微信SDK到底做了什么 前期准备 接入 ...

  5. 超级懒汉编写的基于.NET的微信SDK

    一.前言 特别不喜欢麻烦的一个人,最近碰到了微信开发.下载下来了一些其他人写的微信开发“框架”,但是被恶心到了,实现的太臃肿啦. 最不喜欢的就是把微信返回的xml消息在组装成实体类,所以会比较臃肿,现 ...

  6. Android开发中出现cannot be resolved to a variable错误,也就是R文件不能生成。

    最近开始学过习Android开发,配置完成开发环境后,在创建第一个Android项目就出现了cannot be resolved to a variable错误,也就是R文件不能生成的问题. 以下是从 ...

  7. Xamarin Android绑定微信SDK

    现在几乎所有的APP都集成了向微博,微信等社交平台分享的功能.这些社交平台官方也提供了SDK让开发者使用,对于Android和IOS平台而言,只需要下载官方的SDK,按照官方说明文档进行集成就可以轻松 ...

  8. 基于.NET的轻量级微信SDK

    一.前言 特别不喜欢麻烦的一个人,最近碰到了微信开发.下载下来了一些其他人写的微信开发“框架”,但是被恶心到了,实现的太臃肿啦. 最不喜欢的就是把微信返回的xml消息在组装成实体类,所以会比较臃肿,现 ...

  9. 公众号使用微信sdk的正确姿势

    当我们做微信登录授权,微信公众号的分享,微信的h5支付等等等等的时候难免会用到微信sdk,当我们用react或vue做的spa应用,直接引入后会发现,在按安卓上可以正常调试,而ios上一直报签名错误( ...

随机推荐

  1. QuestaSim 中文注释乱码

    在QuestaSim按如下顺序打开对应窗口, Tools -> Edit Preferences -> By Name -> Find 输入 encoding搜索对应项,将其valu ...

  2. 大数据入门第十一天——hive详解(二)基本操作与分区分桶

    一.基本操作 1.DDL 官网的DDL语法教程:点击查看 建表语句 CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name [(col_name data ...

  3. Spring第二天——IOC注解操作与AOP概念

    大致内容 spring的bean管理(注解实现) AOP原理 log4j介绍 spring整合web项目的演示 一.spring注解实现bean管理 注解: 代码中一些特殊的标记,使用注解也可以完成一 ...

  4. 【转载】COM 组件设计与应用(二)——GUID 和 接口

    原文:http://vckbase.com/index.php/wv/1203.html COM 组件设计与应用 系列文章:http://vckbase.com/index.php/piwz?& ...

  5. 团队合作开发git冲突解决方案 Intellij IDEA

    https://blog.csdn.net/antony9118/article/details/52524873 注:因为我使用的是 idea 2018.1.2的版本,所以在操作上有些变化 将某些操 ...

  6. springmvc 解决@ResponseBody注解返回中文乱码

    使用messageConverters <bean class="org.springframework.web.servlet.mvc.method.annotation.Reque ...

  7. JAVA Eclipse 快捷键 ctrl+f 查找/替换 字符串

  8. HTTPS 数字签名 证书

    HTTPS 先来看一下HTTPS的定义: HTTPS(Hyper Text Transfer Protocol Secure)是一种经过计算机网络进行安全通信的传输协议.HTTPS经由HTTP进行通信 ...

  9. Docker系列之CentOS7安装Docker(一)

    0.前言 整体架构目录:ASP.NET Core分布式项目实战-目录 一.瞎扯淡(只讲有用的) 感兴趣的同学可以上网搜索一下docker具体的介绍.我这边主要介绍偏实战的内容,不喜勿喷,有问题也请指出 ...

  10. Jmeter(二十一)_完整Demo

    1:创建一个线程组   2:添加一个cookie管理器     3:设置你的信息头管理器:application/json;text/plain;charset=UTF-8   44 4:添加一个用户 ...