cloudwu / sproto

Yet another protocol library like google protocol buffers , but simple and fast.
MIT License
942 stars 253 forks source link

sproto中关于user_struct(id)的使用,index是动态的string,value的类型必须是table么? #39

Closed tangyiyang closed 8 years ago

tangyiyang commented 8 years ago
local sproto = require "sproto"
local sprotoparser = require "sprotoparser"

local function test()
    -- this is ok, if the value type is a table

    -- local proto = sproto.parse [[
    --  .entry {
    --      id 0 : string
    --      value 1 : integer
    --  }

    --  .info {
    --      entry 0 : *entry(id)
    --  }
    -- ]]

    -- local data = {
    --  entry = {
    --      ["1001"] = {id = "1001", value = 1},
    --      ["1002"] = {id = "1002", value = 2},
    --      ["1003"] = {id = "1003", value = 3},
    --  }
    -- }
    -- local encoded = proto:encode('info', data)
    -- local decoded = proto:decode('info', encoded)
    -- print_r(decoded)

    -- what if my current data structure is, how to write the proto?
    local data_2 = {
        entry = {
            "1001" = 1,
            "1002" = 2,
            "1003" = 3,
        }
    }
end

return test

data_2 这种结构应该怎么写proto呢?

cloudwu commented 8 years ago
  1. "1001" = 1 不是 lua 语法, ["1001"] = 1 才是
  2. key 就是那个 id. 如果你要 encode , 就必须编码成 sproto 要求的结构。
tangyiyang commented 8 years ago

key 就是那个 id. 如果你要 encode , 就必须编码成 sproto 要求的结构。

但是我的key是动态变化的,不可能在proto里一开始就把所有的key枚举出来。所以这是个无解的问题了?

cloudwu commented 8 years ago

你就没明白这个特性,不解释了。没理解就不要用这个了。

huanzai commented 8 years ago

你可以用struct去做嘛 entry { key 0 : string value 1 : integer }

entrys 0 : *entry

cloudwu commented 8 years ago

@huanzai

应该是 entrys 0 : *entry(key)

huanzai commented 8 years ago

:+1: 比数组更方便

tangyiyang commented 8 years ago

我明白上面那个特性,看上半部分的代码(local data = {})就知道了。

local data = {
        ["0"] = 0,
        ["1001"] = 100001,
        ["1002"] = 100002,
        ["1003"] = 100003,
}

如果要利用这个特性,value的类型必须是table才可以。因为如果不是table,无法知道key的值从哪个地方来获取。

难道我需要枚举出所有的key么?我的意思是,如果一个类似数组的结构,但是key的类型并不是数,而是一个可以转换成数的字符串。如果可以的话,请告诉我怎么做?感谢。:)

通常用sproto的时候会去避免使用这样的结构,但是这个是旧代码,以前是用json作为数据交换格式的。我只是尽可能的想兼容旧的代码。

cloudwu commented 8 years ago

不支持.

cupen commented 8 years ago

@tangyiyang 诚恳地说,你想要的是一个支持map的数据交换格式, google protobuf 新一点的版本是支持的。但你说连key都不知道从哪来的话,就算支持map也满足不了你吧?是不是有什么误会? ;P

cupen commented 8 years ago

@tangyiyang 实在不行,你就换用一些 schema-free 的数据交换格式吧,比如json、msgpack之类,这样就可以闭着眼睛 encode, decode了,很爽。 ;P

tangyiyang commented 8 years ago

感谢大家,问题解决。:)