how to serialize / deserialize classes defined in .proto (protobuf)

Posted by make on Stack Overflow See other posts from Stack Overflow or by make
Published on 2010-03-13T03:22:15Z Indexed on 2010/03/13 3:27 UTC
Read the original article Hit count: 344

Hi,

Could someone please help me with serialization/deserialization classes defined in .proto (protobuf). here is an exp that I am trying to build:

file.proto

message Data{  
  required string x1 = 1;
  required uint32 x2 = 2;
  required float x3 = 3;
}
message DataExge {
  repeated Data data = 1;
}

client.cpp

...
void serialize(const DataExge &data_snd){
    try {
      ofstream ofs("DataExge");
      data_snd.SerializeToOstream(&ofs);

    } catch(exception &e) {
      cerr << "serialize/exception: " << e.what() << endl;    
      exit(1);
    }
}

void deserialize(DataExge &data_rec){
    try {
      ifstream ifs("DataExge");
      data_rec.ParseFromIstream(&ifs);

    } catch(exception& e) {
      cerr << "deserialize/exception: " << e.what() << endl;      
      exit(1);
    }
}

int main(){
...
    DataExge dataexge;
    Data *dat = dataexge.add_data();

    char *y1 = "operation1";
    uint32_t y2 = 123 ;
    float y3 = 3.14;

    // assigning data to send()
    dat->set_set_x1(y1);
    dat->set_set_x2(y2);
    dat->set_set_x3(y3);

    //sending data to the client
    serialize(dataexge); 

    if (send(socket, &dataexge, sizeof(dataexge), 0) < 0) {
       cerr << "send() failed" ;
       exit(1);
     }  

     //receiving data from the server
     deserialize(dataexge); 

     if (recv(socket, &dataexge, sizeof(dataexge), 0) < 0) {
        cerr << "recv() failed";
        exit(1);
     }  

     //printing received data
     cout << dat->x1() << "\n";
     cout << dat->x2() << "\n";
     cout << dat->x3() << "\n";
...
}

server.cpp

...
void serialize(const DataExge &data_snd){
    try {
      ofstream ofs("DataExge");
      data_snd.SerializeToOstream(&ofs);

    } catch(exception &e) {
      cerr << "serialize/exception: " << e.what() << endl;    
      exit(1);
    }
}

void deserialize(DataExge &data_rec){
    try {
      ifstream ifs("DataExge");
      data_rec.ParseFromIstream(&ifs);

    } catch(exception& e) {
      cerr << "deserialize/exception: " << e.what() << endl;      
      exit(1);
    }
}

int main(){
...
DataExge dataexge;
Data *dat = dataexge.add_data();

//receiving data from the client
deserialize(dataexge); 

if (recv(socket, &dataexge, sizeof(dataexge), 0) < 0) {
   cerr << "recv() failed";
   exit(1);
}  

//printing received data
cout << dat->x1() << "\n";
cout << dat->x2() << "\n";
cout << dat->x3() << "\n";

// assigning data to send()
dat->set_set_x1("operation2");
dat->set_set_x2(dat->x2() + 1);
dat->set_set_x3(dat->x3() + 1.1);

//sending data to the client
serialize(dataexge);   //error// I am getting error at this line ...

if (send(socket, &dataexge, sizeof(dataexge), 0) < 0) {
   cerr << "send() failed" ;
   exit(1);
} 
... 
}

Thanks for your help and replies -

© Stack Overflow or respective owner

Related posts about c

    Related posts about c++