Apache Thrift comes with a complete set of server shells, ready to use, in almost all the supported languages. In some cases this is can be excess. This library is one of many possible ways to avoiding of complicated code generation and gain control on it process. Now you can serialize/deserialize your data by the most optimal way, use pseudo-reflection mechanism from the boost library.
#include"TModelField.h"
#include"TPfrDeSerializer.h"
#include"TPfrSerializer.h"
#include<thrift/protocol/TJSONProtocol.h>
#include<thrift/transport/TSimpleFileTransport.h>usingnamespaceapache::thrift;structMyModel {
staticconstexpr serialize::TModelName name = "MyModel";
serialize::TModelField<bool> f0{"Bool", {}};
serialize::TModelField<char> f1{"Char", {}};
serialize::TModelField<int8_t> f2{"Int8", {}};
serialize::TModelField<uint8_t> f3{"Uint8", {}};
serialize::TModelField<int32_t> f4{"Int", {}};
serialize::TModelField<uint32_t> f5{"UInt", {}};
serialize::TModelField<int64_t> f6{"Int64", {}};
serialize::TModelField<uint64_t> f7{"UInt64", {}};
serialize::TModelField<float> f8{"Float", {}};
serialize::TModelField<double> f9{"Double", {3.8}};
serialize::TModelField<std::map<int, double>> f10{"Map", {}};
serialize::TModelField<std::string> f11{"String", {"Hello Thrift"}, false};
serialize::TModelField<std::list<int>> f12{"List", {1, 2, 3}, false}; };
voidserializeExample(std::filesystem::path&& path)
{
auto transWr = std::make_shared<transport::TSimpleFileTransport>(
path.string(), false, true);
auto protoWr = std::make_shared<protocol::TJSONProtocol>(transWr);
serialize::TPfrSerializer<MyModel> serialzer(protoWr);
MyModel data;
data.f2.SetValue(1);
data.f9.SetValue(2.5);
data.f10.Value().try_emplace(4, 5);
data.f10.Value().try_emplace(6, 7);
data.f12.Value().push_back(12);
serialzer.serialize(data);
}
voiddeserializeExample(std::filesystem::path&& path){
auto transRd = std::make_shared<transport::TSimpleFileTransport>(
path.string(), true, false);
auto protoRd = std::make_shared<protocol::TJSONProtocol>(transRd);
MyModel data;
serialize::TPfrDeserializer<MyModel> deserialzer(protoRd);
deserialzer.deserialize(data);
}
intmain()
{
serializeExample("/tmp/out.json");
deserializeExample("/tmp/out.json");
retun 0;
}
In this example the model data will be serialized as:
{
"2": {
"i8": 1
},
"9": {
"dbl": 2.5
},
"11": {
"str": "Hello Thrift"
},
"12": {
"lst": [
"i32",
4,
1,
2,
3,
12
]
}
}and deserialized as:
structMyModel { ...
serialize::TModelField<int8_t> f2{"Int8", {1}, false};
...
serialize::TModelField<double> f9{"Double", {2.5}, false}; ...
serialize::TModelField<std::string> f11{"String", {"Hello Thrift"}, false}; serialize::TModelField<std::list<int>> f12{"List", {1, 2, 3, 12}, false}; };All other fields remain empty (TModelField::IsEmpty() returns true).
Additional examples are available at example directory