亮亮的protobuf之道

google protobuf 的使用

protobuf下载
cmake下载
Visual Studio下载
Git下载

*** 具体步骤可以参考cmake\README.md文件 ***

下载好资源后安装并加入环境变量

  • 将CMake加入环境变量 C:\Program Files (x86)\CMake\bin
  • 将Git加入环境变量 C:\Program Files\Git\cmd
    官网提供CMake releases debug 和 visual studio 三种编译 本文选择vs
  • 1,在protobuf/cmake/新建一个build文件/再创建一个solution文件
  • 2,进入protobuf/cmake/build/solution/文件下输入 命令
cmake -G "Visual Studio 12 2013 Win64" -Dprotobuf_BUILD_TESTS=OFF -DCMAKE_INSTALL_PREFIX=../../../../install ../..
  • 3,点击生成的protobuf.sln文件 vs编译release版生成protoc.exe文件 以便使用

  • 4,js项目 还需给项目按装google-protobuf 模块 同时先按装nodejs环境,nodejs下载

//到项目目录下 运行下命令 或者将下面代码写入bat文件
cd .
npm install google-protobuf
pause

改造protobuf

*** 以下类容都建立在 3.5.1 release 版本上 ***

  • 修改 protobuf toObject 方法将数据 0 默认改成 null
//在google-protobuf里面 找到以下方法并修改
		jspb.Message.setFieldIgnoringDefault_=function(a,b,c,d){c!=d?jspb.Message.setField(a,b,c):a.array[jspb.Message.getIndex_(a,b)]=null};
	改成
		jspb.Message.setFieldIgnoringDefault_=function(a,b,c,d){jspb.Message.setField(a,b,c)};
  • 增加GenerateClassFromObject方法
//在js_generator.cc 文件 GenerateClass 方法中 GenerateClassToObject(options, printer, desc); 上面或下面 增加
GenerateClassFromObject(options, printer, desc);
//如此导出的js方法里面就有 fromObject 接口了。
  • 发送默认数据改造(有数据(包括默认值)才序列化出来)
//在js_generator.cc 文件 GenerateClassSerializeBinaryField 方法中 把所有判断默认条件的语句都注释掉即可
//if (f != null)
//序列化时,会获取值时,没有会取默认值
//修改 HasFieldPresence 为 HasFieldPresenceSerializeBinary
//HasFieldPresenceSerializeBinary就是把HasFieldPresence复制过来 然后把最后一个条件直接改成true即可
//即
//                                    ||
//    field->file()->syntax() == FileDescriptor::SYNTAX_PROTO2;
//变成
//                                    || true;
//
//即要 f = (jspb.Message.getField( 方式
//不要 f = message.get$name$( 方式
  • 缺少定义 goog.isDef
//搜索 var global = Function('return this')();在它下面加上
    printer->Print("goog.isDef = function(a){return a!=null};\n\n");
  • 缺少 goog.array.map
//搜索 goog.array.map 改成 goog.arrayMap然后在 定义 goog.isDef 的下面加上
    printer->Print("goog.arrayMap = function(a,b,c){for(var d=a.length,e=Array(d),f=a,g=0;g<d;g++)g in f&&(e[g]=b.call(c,f[g],g,a));return e};\n\n");

  • 不规范的命名
    *** 具体请下载源文件和修改文件对比 ***
//比如 一个字段名为 user_info  会导成 useInfo
//还有一些保留字 比如break char long等等 会主动加前缀pb_
//在 js_generator.cc文件下修改ParseLowerUnderscore ParseUpperCamel ToLowerCamel ToUpperCamel方法 
  • 调整require请求
    *** 具体请下载源文件和修改文件对比 ***
//require("../in/xxx_pb") 改造成 require("xxx_pb")
//增加GetCommonJSFilename方法 并修改GenerateFile方法
  • repeated int64 结构
    *** 具体请下载源文件和修改文件对比 ***
//详细见JSBinaryReadWriteMethodNameRead和JSBinaryReadWriteMethodNameWrite方法
cocoscreator 使用中除去undefined {} [] 和 null
// 去除获取到的协议对象的Undefined和空的{}、[]
cc.js.clearUndefinedAndEmptyTable = function(obj) {
    for (let key in obj) {
        if (obj.hasOwnProperty(key)) {
            let value = obj[key];
            if (typeof value === "undefined") {
                delete obj[key];
            } else if (cc.js.isTable(value)) {
                if (this.isArray(value) && value.length===0) {
                    delete obj[key];
                } else if (this.isObject(value) && Object.keys(value).length===0) {
                    delete obj[key];
                } else {
                    this.clearUndefinedAndEmptyTable(value);
                }
            }
        }
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值