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);
}
}
}
}
};