zhanjunxiong/luapb

如何使用

Opened this issue · 35 comments

如何使用luapb

把它编译成.so 后者.dll
然后把它加到lua path 路径就行了

请问在ios或android上怎么设置路径?
pb.import(path)

你用什么开发?

我用cocos2dx 3.x开发的

报错的日志是怎样的?

[ProtoImporter] protopath:(null)
/Users/bingtian/Documents/testpbMac.app/Contents/Resources/res/pb/login.proto:-1:0:File not found.
import (/Users/bingtian/Documents/testpbMac.app/Contents/Resources/res/pb/login.proto) file descriptor error

就是import失败,protobuf的importer找不到这个文件,我是在mac开发的

login.proto 文件放在那里?

/Users/bingtian/Documents/testpbMac.app/Contents/Resources/res/pb/login.proto 你看看是不是存在这个文件

就是放在这的/Users/bingtian/Documents/testpbMac.app/Contents/Resources/res/pb/login.proto
是存在的,所以是挺奇怪的

你用相对路径试试?

能读成stream然后,传给protobuf吗?

你可以试试
我这边没有开发环境,不能重现你说的情况,不好实验。

你有用 addSearchPath 吗?

你可以打包一下你的工程 我这边试试

说的这个addSearchPath是cocos2dx的吗?但是这个貌似跟luapb没关联的
我有add的,我项目中的资源都是这么去用的

我刚刚看了protubuf源码,没有提供用stream读取的proto文件的方式,它使用DescriptorPool来统一管理的,要改的话,只能动源码了,而且也不太好入手

我大概想了一下
可以这样做

  1. 把proto文件夹 addSearchPath
  2. 导入login.proto 的时候,直接pb.import("login.proto")
    这样应该可以了 就不用改代码了

我现在是这么写也是不行的
local path = cc.FileUtils:getInstance():fullPathForFilename("pb/login.proto")
pb.import(path)

其中pb的父目录是addSearchPath的

也试过这样也不行
pb.import("pb/login.proto")

但是,cocos2dx的addSearchPath跟protobuf的import没关联的呀,我觉得还是得用绝对路径才行,但是按我第一种用法也不行,我就蛋疼了

你用的protobuf版本是多少的,我用的是2.50的,跟这没关系吧?或者你用的protobuf打包一份给我试试?

cc.FileUtils:getInstance():addSearchPath("proto路径", true)
pb.import("login.proto")

cc.FileUtils:getInstance():addSearchPath("res/pb", true)
pb.import("login.proto")
依然报错:
[ProtoImporter] protopath:(null)
login.proto:-1:0:File not found.
import (login.proto) file descriptor error

你也是做手游的?

是的
我晚上搭个环境试试你的情况
说一下你的开发环境

现在没有环境 不好实验

我是在mac下开发的,用xcode6.1,cocos2dx 3.4版本
真是麻烦你了
你那边不会出现这种情况吗?

我断点去跟踪,终于发现为啥了,原来它不支持直接传前缀带/的路径名,我就设置了mapPath,然后就可以了。自己加了两个方法方法
void ProtoImporter::setMapPath(const std::string& filename){
sourceTree.MapPath("", filename);
}
static int pb_setMapPath(lua_State* L)
{
const char* filename = luaL_checkstring(L, 1);
sProtoImporter.setMapPath(filename);
return 0;
}

用法:
local path = cc.FileUtils:getInstance():fullPathForFilename("pb/login.proto")
local mapPath = string.sub(path,0,string.len(path)-11)
pb.setMapPath(mapPath)
pb.import("login.proto")

暂时试了ios和mac都没问题,android后面再试试看

请问,怎么判断某个字段没有值?

是指?

pb_get那我修改了下,加了判断
reflection->HasField(*message, field)

message MRoleObj
{
optional int64 rid = 1;
optional string name = 2;
optional int32 job = 3;
optional int32 sex = 4;
optional int32 level = 5;
optional int64 exp = 6;
}
现在发现一个问题,如果一个字段服务器设置0的话,那它后面的字段都客户端就获取不了值了,但如果不设置值,又一切正常,请问你遇到这种问题吗?

现在发现一个问题,如果一个字段服务器设置0的话,那它后面的字段都客户端就获取不了值了,但如果不设置值,又一切正常,请问你遇到这种问题吗?
不太明白 这里的意思?

就比如服务器设置
rid=1,name="test",job=1,sex=0,level=2,exp=5
我客户端就只解析到rid=1,name=“test”,job=1,sex,level,exp都没有值了
但如何不设置sex的话,那rid,name,job,level,exp,都能正常解析出来

说白了,就是服务器不能传0,一传0,后面的值,就解析不出来了

没出现过
你是怎么解析服务端发过来的数据的
是不是被截断了?

还真是被截断了,我是从c++这边收到数据再传给lua的,然后再进行解析的,那该如何防止被截断?

你用的接口是?

问题解决了,是c++这边的问题,跟lua没关系