¿Cómo se agrega un campo repetido usando el búfer de protocolo de Google en C++?

2 minutos de lectura

avatar de usuario
aajkaltak

Tengo el siguiente búfer de protocolo. Tenga en cuenta que StockStatic es un campo repetido.

message ServiceResponse
{
    enum Type
    {
        REQUEST_FAILED = 1;
        STOCK_STATIC_SNAPSHOT = 2;
    }

    message StockStaticSnapshot
    {
        repeated StockStatic stock_static = 1;
    }
    required Type type = 1;
    optional StockStaticSnapshot stock_static_snapshot = 2;
}

message StockStatic
{
    optional string sector      = 1;
    optional string subsector   = 2;
}

Estoy completando los campos StockStatic mientras itero a través de un vector.

ServiceResponse.set_type(ServiceResponse_Type_STOCK_STATIC_SNAPSHOT);

ServiceResponse_StockStaticSnapshot stockStaticSnapshot;

for (vector<stockStaticInfo>::iterator it = m_staticStocks.begin(); it!= m_staticStocks.end(); ++it)
{
    StockStatic* pStockStaticEntity = stockStaticSnapshot.add_stock_static();

    SetStockStaticProtoFields(*it, pStockStaticEntity); // sets sector and subsector field to pStockStaticEntity by reading the fields using (*it)
}

Pero el código anterior es correcto solo si StockStatic era un campo opcional y no un campo repetido. Mi pregunta es ¿qué línea de código me falta para que sea un campo repetido?

  • Solo por curiosidad, ¿cuál es exactamente el problema al que te enfrentas cuando lo repites?

    – VNarasimhaM

    20 de noviembre de 2009 a las 14:59

avatar de usuario
leegente

No, estás haciendo lo correcto.

Aquí hay un fragmento de mi búfer de protocolo (los detalles se omiten por brevedad):

message DemandSummary
{
    required uint32 solutionIndex     = 1;
    required uint32 demandID          = 2;
}
message ComputeResponse
{
    repeated DemandSummary solutionInfo  = 3;
}

…y el C++ para completar ComputeResponse::solutionInfo:

ComputeResponse response;

for ( int i = 0; i < demList.size(); ++i ) {

    DemandSummary* summary = response.add_solutioninfo();
    summary->set_solutionindex(solutionID);
    summary->set_demandid(demList[i].toUInt());
}

response.solutionInfo ahora contiene demList.size() elementos.

  • Gracias… Me acabo de dar cuenta de la llamada a response->add_solutioninfo() —- agrega más de 1 elemento… ¡gracias!

    – aajkaltak

    20 de noviembre de 2009 a las 15:23

  • DemandSummary* summary = response->add_solutioninfo(); debe ser cambiado a DemandSummary* summary = response.add_solutioninfo(); Por alguna razón, stackoverflow dice que la cola de edición sugerida está llena

    –Allen Wang

    11 de marzo de 2021 a las 16:27

Aquí el código de muestra de C++ pero puede no ser eficiente:

message MyArray
{
    repeated uint64 my_data = 1;
}
//Copy
std::array<unsigned long long, 5> test={1,1,2,3,5};
mynamespace::MyArray pbvar;
auto *dst_ptr = keys.my_data();
google::protobuf::RepeatedField<google::protobuf::uint64> field{test.begin(), test.end()};
dst_ptr->CopyFrom(field);

//Output
for (auto it : pbvar.my_data())
    std::cout<<it<<" ";
std::cout<<std::endl;

Otra forma de lograr lo mismo:

message SearchResponse {
  message Result {
  required string url = 1;
  optional string title = 2;
  repeated string snippets = 3;
  }  
  repeated Result result = 1;
}

  • por fragmento de cadena repetido ¿Cuál será el código cpp?

    –Rohan Nagalkar

    7 de febrero de 2018 a las 16:04

¿Ha sido útil esta solución?