协议缓冲区对象字节大小错误

时间:2014-08-27 19:29:03

标签: c++ protocol-buffers

我有以下方法:

void ConnectionManager::SendAll()
{
for (int t = 0; t < (int)m_Connections.size(); ++t)
{
    if (m_Connections[t].socket != INVALID_SOCKET)
    {
        // Create the object
        MessageID message;
        message.set_type(MessageID::Type::MessageID_Type_PLAYERDATA);

        for (int i = 0; i < (int)m_Connections.size(); ++i)
        {
            if (m_Connections[i].playerData.username() != google::protobuf::internal::kEmptyString)
            {
                auto temp = message.add_playerdata();   
                temp = &m_Connections[i].playerData;
            }
        }

        if (message.playerdata_size() > 0)
        {
            // Serialize to byte array
            int size = message.ByteSize();
            void* buffer = malloc(size);
            message.SerializeToArray(buffer, size);

            Send(m_Connections[t].socket, buffer, size);
        }
    }
}
}

现在问题出在这个方法的最后,在第<:p>行

int size = message.ByteSize();

我知道数据已正确加载(或至少应该加载),但尺寸不对。它应该是30并且它返回2.我不知道我做错了什么。

m_Connections中的数据可用,应该由指针temp访问。我认为,出于某种原因,数据会从&#34;消息中消失。对象,但我不知道如何解决它。

1 个答案:

答案 0 :(得分:1)

auto temp = message.add_playerdata();   
temp = &m_Connections[i].playerData;

这些行看起来不对。 add_playerdata()返回一个指针。这意味着第二行只是将temp设置为其他指针,而不对temp指向的消息执行任何操作。如果你写出类型而不是使用auto

,那就更明显了
MessageID::PlayerData* temp = message.add_playerdata();   
temp = &m_Connections[i].playerData;

也许你想这样做:

*temp = m_Connections[i].playerData;

但是,我不知道这个错误会导致ByteSize()成为2.如果你没有在消息中添加任何玩家,那么ByteSize()看起来应该只有2个。然后playerdata_size()将为零,因此您根本无法进入序列化步骤。