DelegateMQ
Loading...
Searching...
No Matches
rapidjson/Serializer.h
Go to the documentation of this file.
1#ifndef SERIALIZER_H
2#define SERIALIZER_H
3
10
12#include "rapidjson/document.h"
13#include "rapidjson/prettywriter.h"
14#include <iostream>
15
16// make_serialized serializes each remote function argument
17template<typename Arg1, typename... Args>
18void make_serialized(rapidjson::PrettyWriter<rapidjson::StringBuffer>& writer, std::ostream& os, Arg1& arg1, Args... args) {
19 arg1.Write(writer, os);
20
21 // Recursively call for other arguments
22 if constexpr (sizeof...(args) > 0) {
23 make_serialized(writer, os, args...);
24 }
25}
26
27// make_unserialized unserializes each remote function argument
28template<typename... Ts>
29void make_unserialized(rapidjson::Document& doc, std::istream& is) { }
30
31template<typename Arg1, typename... Args>
32void make_unserialized(rapidjson::Document& doc, std::istream& is, Arg1& arg1, Args&&... args) {
33 arg1.Read(doc, is);
34
35 // Recursively call for other arguments
36 if constexpr (sizeof...(args) > 0) {
37 make_unserialized(doc, is, args...);
38 }
39}
40
41template <class R>
42struct Serializer; // Not defined
43
44// Serialize all target function argument data using serialize class
45template<class RetType, class... Args>
46class Serializer<RetType(Args...)> : public dmq::ISerializer<RetType(Args...)>
47{
48public:
49 // Write arguments to a stream
50 virtual std::ostream& Write(std::ostream& os, Args... args) override {
51 try {
52 os.seekp(0, std::ios::beg);
53 rapidjson::StringBuffer sb;
54 rapidjson::PrettyWriter<rapidjson::StringBuffer> writer(sb);
55
56 make_serialized(writer, os, args...);
57 if (writer.IsComplete())
58 os << sb.GetString();
59 else
60 os.setstate(std::ios::failbit);
61 }
62 catch (const std::exception& e) {
63 std::cerr << "Serialize error: " << e.what() << std::endl;
64 throw;
65 }
66 return os;
67 }
68
69 // Read arguments from a stream
70 virtual std::istream& Read(std::istream& is, Args&... args) override {
71 try {
72 // Get stream length
73 std::streampos current_pos = is.tellg();
74 is.seekg(0, std::ios::end);
75 int length = static_cast<int>(is.tellg());
76 is.seekg(current_pos, std::ios::beg);
77
78 // Allocate storage buffer
79 char* buf = (char*)malloc(length + 1);
80 if (!buf)
81 return is;
82
83 // Copy into buffer
84 is.rdbuf()->sgetn(buf, length);
85 buf[length] = 0; // null terminate incoming data
86
87 //std::cout << buf;
88
89 // Parse JSON
90 rapidjson::Document doc;
91 doc.Parse(buf);
92
93 // Check for parsing errors
94 if (doc.HasParseError())
95 {
96 // Let caller know read failed
97 is.setstate(std::ios::failbit);
98 std::cout << "Parse error: " << doc.GetParseError() << std::endl;
99 std::cout << "Error offset: " << doc.GetErrorOffset() << std::endl;
100 free(buf);
101 return is;
102 }
103
104 make_unserialized(doc, is, args...);
105 free(buf);
106 return is;
107 }
108 catch (const std::exception& e) {
109 std::cerr << "Deserialize error: " << e.what() << std::endl;
110 throw;
111 }
112 return is;
113 }
114};
115
116#endif
Delegate serializer interface class.
virtual std::istream & Read(std::istream &is, Args &... args) override
Definition rapidjson/Serializer.h:70
virtual std::ostream & Write(std::ostream &os, Args... args) override
Definition rapidjson/Serializer.h:50
void make_unserialized(msgpack::unpacker &unpacker, Arg1 &arg1, Args &&... args)
Definition msgpack/Serializer.h:33
void make_serialized(msgpack::sbuffer &buffer, Arg1 &arg1, Args... args)
Definition msgpack/Serializer.h:22
void make_unserialized(rapidjson::Document &doc, std::istream &is)
Definition rapidjson/Serializer.h:29
void make_serialized(rapidjson::PrettyWriter< rapidjson::StringBuffer > &writer, std::ostream &os, Arg1 &arg1, Args... args)
Definition rapidjson/Serializer.h:18
Definition msgpack/Serializer.h:48
Definition ISerializer.h:12