【问题标题】:msgpage C++ : send raw pointer with MSGPACK_DEFINEmsgpage C++:使用 MSGPACK_DEFINE 发送原始指针
【发布时间】:2016-07-14 15:31:24
【问题描述】:

我想通过 msgpack 发送以下结构。

struct MyStruct {
    std::string     name{""};
    int*            val{nullptr};

    MSGPACK_DEFINE( name, val );
};

到目前为止,在我的所有项目中,我使用 msgpack 进行流式传输的唯一方法是使用 MSGPACK_DEFINE,然后将结构写入 msgpack::sbuffer(并发送它)。 MSGPACK_DEFINE 宏抱怨说我可能错过了“->”,所以我猜它没有检测到它是一个指针。

智能指针似乎可以工作:

struct MyStruct {
    std::string          name{""};
    std::shared_ptr<int> val{nullptr};

    MSGPACK_DEFINE( name, val );
};

需要注意的是,另一端的接收者需要 val 是一个原始指针。我想这样做而不在接收端进行转换。有什么想法吗?

【问题讨论】:

    标签: c++ pointers serialization stream msgpack


    【解决方案1】:

    您未能解释为什么要这样做。指针在序列化时永远没有意义(否则它是进程内数据,不需要序列化)。

    只需传递指针指向的值。如果您需要表示“数字或 NULL”,则传递一个包含整数和布尔值的结构。

    struct NullableInt {
        int value{0};
        bool null{true};
    };
    

    【讨论】:

    • 这只是一个简单的例子。实际上,它实际上是指向其他结构的指针。我正在发送一个树结构。我对序列化它(以某种方式)很好,但不知道任何可能有效的 msgpack 宏,或者解决它的方法。我认为答案是后端更简单的结构,然后在接收端使用原始指针执行所有魔术。
    • 让我重申一下:指针在序列化时永远没有意义。
    • 让我澄清一下:我想知道宏是否可以取消引用指针并以某种有意义的方式为我序列化它。如果它包含在 shared_ptr 中,它可以正常工作。
    • 啊。现在我明白你在追求什么了。不,除了 char* 之外,不支持原始指针。您需要使用 adapter/char_ptr.hpp 或 adapter/cpp11/shared_ptr.hpp 中的内容扩展 MSGPACK。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-30
    • 2012-09-07
    • 1970-01-01
    • 2013-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多