Protocol Buffers - Google's data interchange format (grpc依赖)
https://developers.google.com/protocol-buffers/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
75 lines
2.7 KiB
75 lines
2.7 KiB
5 years ago
|
#include "benchmarks.pb.h"
|
||
|
#include "datasets/google_message1/proto2/benchmark_message1_proto2.pb.h"
|
||
|
#include "datasets/google_message1/proto3/benchmark_message1_proto3.pb.h"
|
||
|
#include "datasets/google_message2/benchmark_message2.pb.h"
|
||
|
#include "datasets/google_message3/benchmark_message3.pb.h"
|
||
|
#include "datasets/google_message4/benchmark_message4.pb.h"
|
||
|
#include "data_proto2_to_proto3_util.h"
|
||
|
|
||
|
#include <fstream>
|
||
|
|
||
|
using google::protobuf::util::Proto3DataStripper;
|
||
|
|
||
|
std::string ReadFile(const std::string& name) {
|
||
|
std::ifstream file(name.c_str());
|
||
|
GOOGLE_CHECK(file.is_open()) << "Couldn't find file '"
|
||
|
<< name
|
||
|
<< "', please make sure you are running this command from the benchmarks"
|
||
|
<< " directory.\n";
|
||
|
return std::string((std::istreambuf_iterator<char>(file)),
|
||
|
std::istreambuf_iterator<char>());
|
||
|
}
|
||
|
|
||
|
int main(int argc, char *argv[]) {
|
||
|
if (argc % 2 == 0 || argc == 1) {
|
||
|
std::cerr << "Usage: [input_files] [output_file_names] where " <<
|
||
|
"input_files are one to one mapping to output_file_names." <<
|
||
|
std::endl;
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
for (int i = argc / 2; i > 0; i--) {
|
||
|
const std::string &input_file = argv[i];
|
||
|
const std::string &output_file = argv[i + argc / 2];
|
||
|
|
||
|
std::cerr << "Generating " << input_file
|
||
|
<< " to " << output_file << std::endl;
|
||
|
benchmarks::BenchmarkDataset dataset;
|
||
|
Message* message;
|
||
|
std::string dataset_payload = ReadFile(input_file);
|
||
|
GOOGLE_CHECK(dataset.ParseFromString(dataset_payload))
|
||
|
<< "Can' t parse data file " << input_file;
|
||
|
|
||
|
if (dataset.message_name() == "benchmarks.proto3.GoogleMessage1") {
|
||
|
message = new benchmarks::proto3::GoogleMessage1;
|
||
|
} else if (dataset.message_name() == "benchmarks.proto2.GoogleMessage1") {
|
||
|
message = new benchmarks::proto2::GoogleMessage1;
|
||
|
} else if (dataset.message_name() == "benchmarks.proto2.GoogleMessage2") {
|
||
|
message = new benchmarks::proto2::GoogleMessage2;
|
||
|
} else if (dataset.message_name() ==
|
||
|
"benchmarks.google_message3.GoogleMessage3") {
|
||
|
message = new benchmarks::google_message3::GoogleMessage3;
|
||
|
} else if (dataset.message_name() ==
|
||
|
"benchmarks.google_message4.GoogleMessage4") {
|
||
|
message = new benchmarks::google_message4::GoogleMessage4;
|
||
|
} else {
|
||
|
std::cerr << "Unknown message type: " << dataset.message_name();
|
||
|
exit(1);
|
||
|
}
|
||
|
|
||
|
for (int i = 0; i < dataset.payload_size(); i++) {
|
||
|
message->ParseFromString(dataset.payload(i));
|
||
|
Proto3DataStripper stripper;
|
||
|
stripper.StripMessage(message);
|
||
|
dataset.set_payload(i, message->SerializeAsString());
|
||
|
}
|
||
|
|
||
|
std::ofstream ofs(output_file);
|
||
|
ofs << dataset.SerializeAsString();
|
||
|
ofs.close();
|
||
|
}
|
||
|
|
||
|
|
||
|
return 0;
|
||
|
}
|