18 #include <unordered_map>
19 #include <unordered_set>
20 #include <type_traits>
22 #include <boost/any.hpp>
23 #include <boost/optional.hpp>
24 #include <boost/optional/optional_io.hpp>
25 #include <boost/uuid/uuid.hpp>
27 #include "hazelcast/client/hazelcast_json_value.h"
28 #include "hazelcast/client/serialization/pimpl/data_input.h"
29 #include "hazelcast/client/serialization/pimpl/data.h"
30 #include "hazelcast/client/serialization/pimpl/data_output.h"
31 #include "hazelcast/client/serialization_config.h"
32 #include "hazelcast/client/partition_aware.h"
33 #include "hazelcast/util/SynchronizedMap.h"
34 #include "hazelcast/util/Disposable.h"
35 #include "hazelcast/client/big_decimal.h"
36 #include "hazelcast/client/local_time.h"
37 #include "hazelcast/client/local_date.h"
38 #include "hazelcast/client/local_date_time.h"
39 #include "hazelcast/client/offset_date_time.h"
41 #if defined(WIN32) || defined(_WIN32) || defined(WIN64) || defined(_WIN64)
43 #pragma warning(disable : 4251)
48 class hazelcast_client;
50 namespace serialization {
51 class object_data_input;
54 class PortableContext;
55 class ClassDefinitionContext;
56 class ClassDefinitionWriter;
57 class DefaultPortableWriter;
58 class DefaultPortableReader;
59 class MorphingPortableReader;
60 class PortableSerializer;
62 class SerializationService;
63 class default_compact_writer;
64 namespace offset_reader {
65 template<
typename OFFSET_TYPE>
67 get_offset(serialization::object_data_input& in,
68 uint32_t variable_offsets_pos,
71 enum struct HAZELCAST_API serialization_constants
73 CONSTANT_TYPE_NULL = 0,
74 CONSTANT_TYPE_PORTABLE = -1,
75 CONSTANT_TYPE_DATA = -2,
76 CONSTANT_TYPE_BYTE = -3,
77 CONSTANT_TYPE_BOOLEAN = -4,
78 CONSTANT_TYPE_CHAR = -5,
79 CONSTANT_TYPE_SHORT = -6,
80 CONSTANT_TYPE_INTEGER = -7,
81 CONSTANT_TYPE_LONG = -8,
82 CONSTANT_TYPE_FLOAT = -9,
83 CONSTANT_TYPE_DOUBLE = -10,
84 CONSTANT_TYPE_STRING = -11,
85 CONSTANT_TYPE_BYTE_ARRAY = -12,
86 CONSTANT_TYPE_BOOLEAN_ARRAY = -13,
87 CONSTANT_TYPE_CHAR_ARRAY = -14,
88 CONSTANT_TYPE_SHORT_ARRAY = -15,
89 CONSTANT_TYPE_INTEGER_ARRAY = -16,
90 CONSTANT_TYPE_LONG_ARRAY = -17,
91 CONSTANT_TYPE_FLOAT_ARRAY = -18,
92 CONSTANT_TYPE_DOUBLE_ARRAY = -19,
93 CONSTANT_TYPE_STRING_ARRAY = -20,
94 CONSTANT_TYPE_UUID = -21,
95 CONSTANT_TYPE_COMPACT = -55,
96 JAVASCRIPT_JSON_SERIALIZATION_TYPE = -130,
98 CONSTANT_TYPE_GLOBAL = INT32_MIN
118 struct HAZELCAST_API object_type
122 serialization_constants type_id;
127 std::ostream HAZELCAST_API&
128 operator<<(std::ostream& os,
const object_type& type);
142 serialization::pimpl::data d,
143 serialization::pimpl::SerializationService& serialization_service);
149 serialization::pimpl::object_type get_type()
const;
163 boost::optional<T> get()
const;
169 const serialization::pimpl::data& get_data()
const;
172 serialization::pimpl::data data_;
173 serialization::pimpl::SerializationService* ss_;
179 namespace serialization {
180 class object_data_input;
181 class object_data_output;
182 class portable_reader;
183 struct compact_serializer;
187 class PortableContext;
188 class ClassDefinitionContext;
189 class ClassDefinitionWriter;
190 class DefaultPortableWriter;
191 class DefaultPortableReader;
192 class MorphingPortableReader;
193 class PortableSerializer;
194 class compact_stream_serializer;
195 class DataSerializer;
196 class SerializationService;
213 static pimpl::serialization_constants get_type_id()
215 return pimpl::serialization_constants::CONSTANT_TYPE_GLOBAL;
252 static inline pimpl::serialization_constants get_type_id()
254 return pimpl::serialization_constants::CONSTANT_TYPE_BYTE;
262 static inline pimpl::serialization_constants get_type_id()
264 return pimpl::serialization_constants::CONSTANT_TYPE_BOOLEAN;
272 static inline pimpl::serialization_constants get_type_id()
274 return pimpl::serialization_constants::CONSTANT_TYPE_CHAR;
282 static inline pimpl::serialization_constants get_type_id()
284 return pimpl::serialization_constants::CONSTANT_TYPE_CHAR;
292 static inline pimpl::serialization_constants get_type_id()
294 return pimpl::serialization_constants::CONSTANT_TYPE_SHORT;
302 static inline pimpl::serialization_constants get_type_id()
304 return pimpl::serialization_constants::CONSTANT_TYPE_INTEGER;
312 static inline pimpl::serialization_constants get_type_id()
314 return pimpl::serialization_constants::CONSTANT_TYPE_LONG;
322 static inline pimpl::serialization_constants get_type_id()
324 return pimpl::serialization_constants::CONSTANT_TYPE_FLOAT;
332 static inline pimpl::serialization_constants get_type_id()
334 return pimpl::serialization_constants::CONSTANT_TYPE_DOUBLE;
342 static inline pimpl::serialization_constants get_type_id()
344 return pimpl::serialization_constants::CONSTANT_TYPE_STRING;
353 static inline pimpl::serialization_constants get_type_id()
355 return pimpl::serialization_constants::
356 JAVASCRIPT_JSON_SERIALIZATION_TYPE;
365 static inline pimpl::serialization_constants get_type_id()
367 return pimpl::serialization_constants::CONSTANT_TYPE_BYTE_ARRAY;
376 static inline pimpl::serialization_constants get_type_id()
378 return pimpl::serialization_constants::CONSTANT_TYPE_BOOLEAN_ARRAY;
387 static inline pimpl::serialization_constants get_type_id()
389 return pimpl::serialization_constants::CONSTANT_TYPE_CHAR_ARRAY;
398 static inline pimpl::serialization_constants get_type_id()
400 return pimpl::serialization_constants::CONSTANT_TYPE_SHORT_ARRAY;
409 static inline pimpl::serialization_constants get_type_id()
411 return pimpl::serialization_constants::CONSTANT_TYPE_INTEGER_ARRAY;
420 static inline pimpl::serialization_constants get_type_id()
422 return pimpl::serialization_constants::CONSTANT_TYPE_LONG_ARRAY;
431 static inline pimpl::serialization_constants get_type_id()
433 return pimpl::serialization_constants::CONSTANT_TYPE_FLOAT_ARRAY;
442 static inline pimpl::serialization_constants get_type_id()
444 return pimpl::serialization_constants::CONSTANT_TYPE_DOUBLE_ARRAY;
453 static inline pimpl::serialization_constants get_type_id()
455 return pimpl::serialization_constants::CONSTANT_TYPE_STRING_ARRAY;
464 static inline pimpl::serialization_constants get_type_id()
466 return pimpl::serialization_constants::CONSTANT_TYPE_UUID;
470 enum struct field_type
482 TYPE_PORTABLE_ARRAY = 10,
483 TYPE_BYTE_ARRAY = 11,
484 TYPE_BOOLEAN_ARRAY = 12,
485 TYPE_CHAR_ARRAY = 13,
486 TYPE_SHORT_ARRAY = 14,
488 TYPE_LONG_ARRAY = 16,
489 TYPE_FLOAT_ARRAY = 17,
490 TYPE_DOUBLE_ARRAY = 18,
491 TYPE_STRING_ARRAY = 19
517 field_type
const& type,
524 const std::string& field_name,
525 field_type
const& type,
533 const field_type& get_type()
const;
538 std::string get_name()
const;
543 int get_index()
const;
548 int get_factory_id()
const;
553 int get_class_id()
const;
558 void write_data(pimpl::data_output& data_output);
569 friend std::ostream& operator<<(std::ostream& os,
574 std::string field_name_;
608 bool has_field(
const std::string& field_name)
const;
622 field_type get_field_type(
const std::string& field_name)
const;
627 int get_field_count()
const;
632 int get_factory_id()
const;
637 int get_class_id()
const;
642 int get_version()
const;
648 void set_version_if_not_set(
int new_version);
654 void write_data(pimpl::data_output& data_output);
666 friend std::ostream& operator<<(std::ostream& os,
678 std::unordered_map<std::string, FieldDefinition> field_definitions_map_;
680 std::unique_ptr<std::vector<byte>> binary_;
696 const std::string& field_name,
697 std::shared_ptr<ClassDefinition> def);
700 const std::string& field_name,
701 std::shared_ptr<ClassDefinition> def);
705 void add_field(
const std::string& field_name, field_type
const& field_type);
707 std::shared_ptr<ClassDefinition> build();
709 int get_factory_id();
722 std::vector<FieldDefinition> field_definitions_;
731 static inline typename std::enable_if<
732 std::is_base_of<versioned_portable_serializer, hz_serializer<T>>::value,
740 static inline typename std::enable_if<
741 !std::is_base_of<versioned_portable_serializer, hz_serializer<T>>::value,
743 get_version(
int default_version)
745 return default_version;
750 :
public pimpl::data_input<std::vector<byte>>
752 template<
typename OFFSET_TYPE>
753 friend int32_t pimpl::offset_reader::get_offset(
755 uint32_t variable_offsets_pos,
758 friend class compact_reader;
766 boost::endian::order byte_order,
767 const std::vector<byte>& buffer,
769 pimpl::PortableSerializer& portable_ser,
770 pimpl::compact_stream_serializer& compact_ser,
771 pimpl::DataSerializer& data_ser,
779 typename std::enable_if<
780 !(std::is_array<T>::value &&
781 std::is_same<typename std::remove_all_extents<T>::type,
char>::value),
782 boost::optional<T>>::type
inline read_object();
785 typename std::enable_if<
786 std::is_array<T>::value &&
787 std::is_same<typename std::remove_all_extents<T>::type,
char>::value,
788 boost::optional<std::string>>::type
inline read_object();
791 typename std::enable_if<
792 std::is_base_of<identified_data_serializer, hz_serializer<T>>::value,
793 boost::optional<T>>::type
inline read_object(int32_t type_id);
796 typename std::enable_if<
797 std::is_base_of<portable_serializer, hz_serializer<T>>::value,
798 boost::optional<T>>::type
inline read_object(int32_t type_id);
801 typename std::enable_if<
802 std::is_base_of<compact_serializer, hz_serializer<T>>::value,
803 boost::optional<T>>::type
inline read_object(int32_t type_id);
806 typename std::enable_if<
807 std::is_base_of<builtin_serializer, hz_serializer<T>>::value,
808 boost::optional<T>>::type
inline read_object(int32_t type_id);
811 typename std::enable_if<
812 std::is_base_of<custom_serializer, hz_serializer<T>>::value,
813 boost::optional<T>>::type
inline read_object(int32_t type_id);
822 typename std::enable_if<
823 !(std::is_base_of<identified_data_serializer, hz_serializer<T>>::value ||
824 std::is_base_of<portable_serializer, hz_serializer<T>>::value ||
825 std::is_base_of<compact_serializer, hz_serializer<T>>::value ||
826 std::is_base_of<builtin_serializer, hz_serializer<T>>::value ||
827 std::is_base_of<custom_serializer, hz_serializer<T>>::value),
831 pimpl::PortableSerializer& portable_serializer_;
832 pimpl::compact_stream_serializer& compact_serializer_;
833 pimpl::DataSerializer& data_serializer_;
834 std::shared_ptr<serialization::global_serializer> global_serializer_;
839 friend pimpl::DefaultPortableWriter;
840 friend pimpl::default_compact_writer;
847 boost::endian::order byte_order,
848 bool dont_write =
false,
849 pimpl::PortableSerializer* portable_ser =
nullptr,
850 pimpl::compact_stream_serializer* compact_ser =
nullptr,
855 void write_object(
const T*
object);
860 typename std::enable_if<
861 !(std::is_array<T>::value &&
862 std::is_same<typename std::remove_all_extents<T>::type,
char>::value),
864 write_object(
const boost::optional<T>&
object);
867 typename std::enable_if<
868 std::is_array<T>::value &&
869 std::is_same<typename std::remove_all_extents<T>::type,
char>::value,
870 void>::type
inline write_object(
const T&
object);
873 typename std::enable_if<
874 std::is_base_of<builtin_serializer, hz_serializer<T>>::value,
875 void>::type
inline write_object(
const T&
object);
878 typename std::enable_if<
879 std::is_base_of<identified_data_serializer, hz_serializer<T>>::value,
880 void>::type
inline write_object(
const T&
object);
883 typename std::enable_if<
884 std::is_base_of<portable_serializer, hz_serializer<T>>::value,
885 void>::type
inline write_object(
const T&
object);
888 typename std::enable_if<
889 std::is_base_of<compact_serializer, hz_serializer<T>>::value,
890 void>::type
inline write_object(
const T&
object);
893 typename std::enable_if<
894 std::is_base_of<custom_serializer, hz_serializer<T>>::value,
895 void>::type
inline write_object(
const T&
object);
898 typename std::enable_if<
899 !(std::is_base_of<builtin_serializer, hz_serializer<T>>::value ||
900 std::is_base_of<identified_data_serializer, hz_serializer<T>>::value ||
901 std::is_base_of<portable_serializer, hz_serializer<T>>::value ||
902 std::is_base_of<compact_serializer, hz_serializer<T>>::value ||
903 std::is_base_of<custom_serializer, hz_serializer<T>>::value ||
904 (std::is_array<T>::value &&
905 std::is_same<typename std::remove_all_extents<T>::type,
char>::value)),
906 void>::type
inline write_object(
const T
object);
908 void write_objects() {}
910 template<
typename FirstObjectType,
typename... OtherObjects>
911 inline void write_objects(
const FirstObjectType&
object,
912 const OtherObjects&... objects)
914 write_object(
object);
915 write_objects(objects...);
919 inline void write_bytes(
const T& s)
922 output_stream_.push_back(c);
927 pimpl::PortableSerializer* portable_serializer_;
928 pimpl::compact_stream_serializer* compact_serializer_;
929 std::shared_ptr<serialization::global_serializer> global_serializer_;
934 object_data_output::write_object(
const char*
object);
937 class HAZELCAST_API serialization_util
941 static typename std::enable_if<
942 std::is_same<boost::multiprecision::cpp_int,
943 typename std::remove_cv<T>::type>::value,
948 std::vector<int8_t> bytes(size);
950 return client::pimpl::from_bytes(std::move(bytes));
954 static typename std::enable_if<
955 std::is_same<boost::multiprecision::cpp_int,
956 typename std::remove_cv<T>::type>::value,
961 auto v = hazelcast::client::pimpl::to_bytes(value);
962 object_data_output.write(v);
966 static typename std::enable_if<
968 typename std::remove_cv<T>::type>::value,
972 auto cpp_int = read<boost::multiprecision::cpp_int>(object_data_input);
973 int32_t scale = object_data_input.read<int32_t>();
978 static typename std::enable_if<
979 std::is_same<client::big_decimal,
980 typename std::remove_cv<T>::type>::value,
982 write(client::serialization::object_data_output& object_data_output,
985 write(object_data_output, value.unscaled);
986 object_data_output.write(value.scale);
990 static typename std::enable_if<
991 std::is_same<client::local_time, typename std::remove_cv<T>::type>::value,
993 read(client::serialization::object_data_input& object_data_input)
995 byte hour = object_data_input.read<
byte>();
996 byte minute = object_data_input.read<
byte>();
997 byte second = object_data_input.read<
byte>();
998 int32_t nano = object_data_input.read<int32_t>();
999 return client::local_time{ hour, minute, second, nano };
1002 template<
typename T>
1003 static typename std::enable_if<
1004 std::is_same<client::local_time, typename std::remove_cv<T>::type>::value,
1006 write(client::serialization::object_data_output& object_data_output,
1009 object_data_output.write<
byte>(value.hours);
1010 object_data_output.write<
byte>(value.minutes);
1011 object_data_output.write<
byte>(value.seconds);
1012 object_data_output.write<int32_t>(value.nanos);
1015 template<
typename T>
1016 static typename std::enable_if<
1017 std::is_same<client::local_date, typename std::remove_cv<T>::type>::value,
1019 read(client::serialization::object_data_input& object_data_input)
1021 int32_t year = object_data_input.read<int32_t>();
1022 byte month = object_data_input.read<
byte>();
1023 byte dayOfMonth = object_data_input.read<
byte>();
1024 return client::local_date{ year, month, dayOfMonth };
1027 template<
typename T>
1028 static typename std::enable_if<
1029 std::is_same<client::local_date, typename std::remove_cv<T>::type>::value,
1031 write(client::serialization::object_data_output& object_data_output,
1034 object_data_output.write<int32_t>(value.year);
1035 object_data_output.write<
byte>(value.month);
1036 object_data_output.write<
byte>(value.day_of_month);
1039 template<
typename T>
1040 static typename std::enable_if<
1041 std::is_same<client::local_date_time,
1042 typename std::remove_cv<T>::type>::value,
1044 read(client::serialization::object_data_input& object_data_input)
1046 auto date = read<client::local_date>(object_data_input);
1047 auto time = read<client::local_time>(object_data_input);
1048 return client::local_date_time{ date, time };
1051 template<
typename T>
1052 static typename std::enable_if<
1053 std::is_same<client::local_date_time,
1054 typename std::remove_cv<T>::type>::value,
1056 write(client::serialization::object_data_output& object_data_output,
1059 write(object_data_output, value.date);
1060 write(object_data_output, value.time);
1063 template<
typename T>
1064 static typename std::enable_if<
1065 std::is_same<client::offset_date_time,
1066 typename std::remove_cv<T>::type>::value,
1068 read(client::serialization::object_data_input& object_data_input)
1070 auto local_date_time = read<client::local_date_time>(object_data_input);
1071 int32_t zoneTotalSeconds = object_data_input.read<int32_t>();
1072 return client::offset_date_time{ local_date_time, zoneTotalSeconds };
1075 template<
typename T>
1076 static typename std::enable_if<
1077 std::is_same<client::offset_date_time,
1078 typename std::remove_cv<T>::type>::value,
1080 write(client::serialization::object_data_output& object_data_output,
1083 write(object_data_output, value.date_time);
1084 object_data_output.write<int32_t>(value.zone_offset_in_seconds);
1088 class HAZELCAST_API PortableContext
1091 PortableContext(
const serialization_config& serialization_conf);
1093 int get_class_version(
int factory_id,
int class_id);
1095 void set_class_version(
int factory_id,
int class_id,
int version);
1097 std::shared_ptr<ClassDefinition> lookup_class_definition(
int factory_id,
1101 std::shared_ptr<ClassDefinition> register_class_definition(
1102 std::shared_ptr<ClassDefinition>);
1104 template<
typename T>
1105 std::shared_ptr<ClassDefinition> lookup_or_register_class_definition(
1110 std::shared_ptr<ClassDefinition> read_class_definition(
1111 object_data_input& input,
1116 const serialization_config& get_serialization_config()
const;
1118 template<
typename T>
1119 typename std::enable_if<
1120 std::is_same<byte, typename std::remove_cv<T>::type>::value,
1121 field_type>::type
static get_type()
1123 return field_type::TYPE_BYTE;
1126 template<
typename T>
1127 typename std::enable_if<
1128 std::is_same<char, typename std::remove_cv<T>::type>::value,
1129 field_type>::type
static get_type()
1131 return field_type::TYPE_CHAR;
1134 template<
typename T>
1135 typename std::enable_if<
1136 std::is_same<char16_t, typename std::remove_cv<T>::type>::value,
1137 field_type>::type
static get_type()
1139 return field_type::TYPE_CHAR;
1142 template<
typename T>
1143 typename std::enable_if<
1144 std::is_same<bool, typename std::remove_cv<T>::type>::value,
1145 field_type>::type
static get_type()
1147 return field_type::TYPE_BOOLEAN;
1150 template<
typename T>
1151 typename std::enable_if<
1152 std::is_same<int16_t, typename std::remove_cv<T>::type>::value,
1153 field_type>::type
static get_type()
1155 return field_type::TYPE_SHORT;
1158 template<
typename T>
1159 typename std::enable_if<
1160 std::is_same<int32_t, typename std::remove_cv<T>::type>::value,
1161 field_type>::type
static get_type()
1163 return field_type::TYPE_INT;
1166 template<
typename T>
1167 typename std::enable_if<
1168 std::is_same<int64_t, typename std::remove_cv<T>::type>::value,
1169 field_type>::type
static get_type()
1171 return field_type::TYPE_LONG;
1174 template<
typename T>
1175 typename std::enable_if<
1176 std::is_same<float, typename std::remove_cv<T>::type>::value,
1177 field_type>::type
static get_type()
1179 return field_type::TYPE_FLOAT;
1182 template<
typename T>
1183 typename std::enable_if<
1184 std::is_same<double, typename std::remove_cv<T>::type>::value,
1185 field_type>::type
static get_type()
1187 return field_type::TYPE_DOUBLE;
1190 template<
typename T>
1191 typename std::enable_if<
1192 std::is_same<std::string, typename std::remove_cv<T>::type>::value,
1193 field_type>::type
static get_type()
1195 return field_type::TYPE_STRING;
1198 template<
typename T>
1199 typename std::enable_if<
1200 std::is_same<std::vector<byte>,
typename std::remove_cv<T>::type>::value,
1201 field_type>::type
static get_type()
1203 return field_type::TYPE_BYTE_ARRAY;
1206 template<
typename T>
1207 typename std::enable_if<
1208 std::is_same<std::vector<char>,
typename std::remove_cv<T>::type>::value,
1209 field_type>::type
static get_type()
1211 return field_type::TYPE_CHAR_ARRAY;
1214 template<
typename T>
1215 typename std::enable_if<
1216 std::is_same<std::vector<bool>,
typename std::remove_cv<T>::type>::value,
1217 field_type>::type
static get_type()
1219 return field_type::TYPE_BOOLEAN_ARRAY;
1222 template<
typename T>
1223 typename std::enable_if<
1224 std::is_same<std::vector<int16_t>,
1225 typename std::remove_cv<T>::type>::value,
1226 field_type>::type
static get_type()
1228 return field_type::TYPE_SHORT_ARRAY;
1231 template<
typename T>
1232 typename std::enable_if<
1233 std::is_same<std::vector<int32_t>,
1234 typename std::remove_cv<T>::type>::value,
1235 field_type>::type
static get_type()
1237 return field_type::TYPE_INT_ARRAY;
1240 template<
typename T>
1241 typename std::enable_if<
1242 std::is_same<std::vector<int64_t>,
1243 typename std::remove_cv<T>::type>::value,
1244 field_type>::type
static get_type()
1246 return field_type::TYPE_LONG_ARRAY;
1249 template<
typename T>
1250 typename std::enable_if<
1251 std::is_same<std::vector<float>,
typename std::remove_cv<T>::type>::value,
1252 field_type>::type
static get_type()
1254 return field_type::TYPE_FLOAT_ARRAY;
1257 template<
typename T>
1258 typename std::enable_if<
1259 std::is_same<std::vector<double>,
1260 typename std::remove_cv<T>::type>::value,
1261 field_type>::type
static get_type()
1263 return field_type::TYPE_DOUBLE_ARRAY;
1266 template<
typename T>
1267 typename std::enable_if<
1268 std::is_same<std::vector<std::string>,
1269 typename std::remove_cv<T>::type>::value,
1270 field_type>::type
static get_type()
1272 return field_type::TYPE_STRING_ARRAY;
1276 PortableContext(
const PortableContext&) =
delete;
1278 ClassDefinitionContext& get_class_definition_context(
int factory_id);
1280 void operator=(
const PortableContext&) =
delete;
1282 util::SynchronizedMap<int, ClassDefinitionContext> class_def_context_map_;
1283 const serialization_config& serialization_config_;
1286 class ClassDefinitionContext
1289 ClassDefinitionContext(
int portable_context, PortableContext* p_context);
1291 int get_class_version(
int class_id);
1293 void set_class_version(
int class_id,
int version);
1295 std::shared_ptr<ClassDefinition> lookup(
int,
int);
1297 std::shared_ptr<ClassDefinition> register_class_definition(
1298 std::shared_ptr<ClassDefinition>);
1301 int64_t combine_to_long(
int x,
int y)
const;
1303 const int factory_id_;
1304 util::SynchronizedMap<long long, ClassDefinition> versioned_definitions_;
1305 util::SynchronizedMap<int, int> current_class_versions_;
1306 PortableContext* portable_context_;
1309 class HAZELCAST_API ClassDefinitionWriter
1312 ClassDefinitionWriter(PortableContext& portable_context,
1313 ClassDefinitionBuilder& builder);
1315 template<
typename T>
1316 void write(
const std::string& field_name, T value)
1318 typedef typename std::remove_pointer<
typename std::remove_reference<
1319 typename std::remove_cv<T>::type>::type>::type value_type;
1320 builder_.add_field(field_name, PortableContext::get_type<value_type>());
1323 template<
typename T>
1324 void write_null_portable(
const std::string& field_name)
1327 int32_t factoryId = hz_serializer<T>::get_factory_id();
1328 int32_t classId = hz_serializer<T>::get_class_id();
1329 std::shared_ptr<ClassDefinition> nestedClassDef =
1330 context_.lookup_class_definition(
1331 factoryId, classId, context_.get_version());
1332 if (!nestedClassDef) {
1333 BOOST_THROW_EXCEPTION(exception::hazelcast_serialization(
1334 "ClassDefWriter::write_null_portable",
1335 "Cannot write null portable without explicitly registering class "
1338 builder_.add_portable_field(field_name, nestedClassDef);
1341 template<
typename T>
1342 void write_portable(
const std::string& field_name,
const T* portable)
1344 if (NULL == portable) {
1345 BOOST_THROW_EXCEPTION(exception::hazelcast_serialization(
1346 "ClassDefinitionWriter::write_portable",
1347 "Cannot write null portable without explicitly registering class "
1351 std::shared_ptr<ClassDefinition> nestedClassDef =
1352 create_nested_class_def(*portable);
1353 builder_.add_portable_field(field_name, nestedClassDef);
1356 template<
typename T>
1357 void write_portable_array(
const std::string& field_name,
1358 const std::vector<T>* portables)
1360 if (NULL == portables || portables->size() == 0) {
1361 BOOST_THROW_EXCEPTION(exception::hazelcast_serialization(
1362 "ClassDefinitionWriter::write_portableArray",
1363 "Cannot write null portable array without explicitly registering "
1364 "class definition!"));
1366 std::shared_ptr<ClassDefinition> nestedClassDef =
1367 create_nested_class_def((*portables)[0]);
1368 builder_.add_portable_array_field(field_name, nestedClassDef);
1371 std::shared_ptr<ClassDefinition> register_and_get();
1373 object_data_output& get_raw_data_output();
1378 template<
typename T>
1379 std::shared_ptr<ClassDefinition> create_nested_class_def(
const T& portable);
1381 ClassDefinitionBuilder& builder_;
1382 PortableContext& context_;
1383 object_data_output empty_data_output_;
1386 class HAZELCAST_API PortableReaderBase
1389 PortableReaderBase(PortableSerializer& portable_ser,
1390 object_data_input& input,
1391 std::shared_ptr<ClassDefinition> cd);
1393 template<
typename T>
1394 typename std::enable_if<
1395 std::is_same<byte, typename std::remove_cv<T>::type>::value ||
1396 std::is_same<char, typename std::remove_cv<T>::type>::value ||
1397 std::is_same<char16_t, typename std::remove_cv<T>::type>::value ||
1398 std::is_same<bool, typename std::remove_cv<T>::type>::value ||
1399 std::is_same<int16_t, typename std::remove_cv<T>::type>::value ||
1400 std::is_same<int32_t, typename std::remove_cv<T>::type>::value ||
1401 std::is_same<int64_t, typename std::remove_cv<T>::type>::value ||
1402 std::is_same<float, typename std::remove_cv<T>::type>::value ||
1403 std::is_same<double, typename std::remove_cv<T>::type>::value ||
1404 std::is_same<std::string, typename std::remove_cv<T>::type>::value,
1406 read(
const std::string& field_name)
1408 set_position(field_name, PortableContext::get_type<T>());
1409 return data_input_->read<T>();
1412 template<
typename T>
1413 typename std::enable_if<
1414 std::is_same<boost::optional<std::string>,
1415 typename std::remove_cv<T>::type>::value,
1417 read(
const std::string& field_name)
1419 set_position(field_name, PortableContext::get_type<T>());
1420 return data_input_->read<T>();
1423 template<
typename T>
1424 typename std::enable_if<
1425 std::is_same<std::vector<byte>,
1426 typename std::remove_cv<T>::type>::value ||
1427 std::is_same<std::vector<char>,
1428 typename std::remove_cv<T>::type>::value ||
1429 std::is_same<std::vector<bool>,
1430 typename std::remove_cv<T>::type>::value ||
1431 std::is_same<std::vector<int16_t>,
1432 typename std::remove_cv<T>::type>::value ||
1433 std::is_same<std::vector<int32_t>,
1434 typename std::remove_cv<T>::type>::value ||
1435 std::is_same<std::vector<int64_t>,
1436 typename std::remove_cv<T>::type>::value ||
1437 std::is_same<std::vector<float>,
1438 typename std::remove_cv<T>::type>::value ||
1439 std::is_same<std::vector<double>,
1440 typename std::remove_cv<T>::type>::value ||
1441 std::is_same<std::vector<std::string>,
1442 typename std::remove_cv<T>::type>::value,
1443 boost::optional<T>>::type
1444 read(
const std::string& field_name)
1446 set_position(field_name, PortableContext::get_type<T>());
1447 return data_input_->read<T>();
1450 object_data_input& get_raw_data_input();
1455 void set_position(
const std::string& field_name,
1456 field_type
const& field_type);
1458 void check_factory_and_class(FieldDefinition fd,
1460 int class_id)
const;
1462 template<
typename T>
1463 boost::optional<T> get_portable_instance(
const std::string& field_name);
1465 std::shared_ptr<ClassDefinition> cd_;
1466 object_data_input* data_input_;
1467 PortableSerializer* portable_serializer_;
1470 int final_position_;
1475 class HAZELCAST_API DefaultPortableReader :
public PortableReaderBase
1478 DefaultPortableReader(PortableSerializer& portable_ser,
1479 object_data_input& input,
1480 std::shared_ptr<ClassDefinition> cd);
1482 template<
typename T>
1483 boost::optional<T> read_portable(
const std::string& field_name);
1485 template<
typename T>
1486 boost::optional<std::vector<T>> read_portable_array(
1487 const std::string& field_name);
1490 class HAZELCAST_API MorphingPortableReader :
public PortableReaderBase
1493 MorphingPortableReader(PortableSerializer& portable_ser,
1494 object_data_input& input,
1495 std::shared_ptr<ClassDefinition> cd);
1497 template<
typename T>
1498 typename std::enable_if<
1499 std::is_same<int16_t, typename std::remove_cv<T>::type>::value ||
1500 std::is_same<int32_t, typename std::remove_cv<T>::type>::value ||
1501 std::is_same<int64_t, typename std::remove_cv<T>::type>::value ||
1502 std::is_same<float, typename std::remove_cv<T>::type>::value ||
1503 std::is_same<double, typename std::remove_cv<T>::type>::value,
1505 read(
const std::string& field_name)
1507 if (!cd_->has_field(field_name)) {
1510 const field_type& currentFieldType = cd_->get_field_type(field_name);
1511 return read_morphing<T>(currentFieldType, field_name);
1514 template<
typename T>
1515 typename std::enable_if<
1516 std::is_same<byte, typename std::remove_cv<T>::type>::value ||
1517 std::is_same<char, typename std::remove_cv<T>::type>::value ||
1518 std::is_same<char16_t, typename std::remove_cv<T>::type>::value ||
1519 std::is_same<bool, typename std::remove_cv<T>::type>::value,
1521 read(
const std::string& field_name)
1523 if (!cd_->has_field(field_name)) {
1526 return PortableReaderBase::read<T>(field_name);
1529 template<
typename T>
1530 typename std::enable_if<
1531 std::is_same<std::string, typename std::remove_cv<T>::type>::value,
1533 read(
const std::string& field_name)
1535 if (!cd_->has_field(field_name)) {
1536 return std::string();
1538 return PortableReaderBase::read<T>(field_name);
1541 template<
typename T>
1542 typename std::enable_if<
1543 std::is_same<boost::optional<std::string>,
1544 typename std::remove_cv<T>::type>::value,
1546 read(
const std::string& field_name)
1548 if (!cd_->has_field(field_name)) {
1551 return PortableReaderBase::read<T>(field_name);
1554 template<
typename T>
1555 typename std::enable_if<
1556 std::is_same<std::vector<byte>,
1557 typename std::remove_cv<T>::type>::value ||
1558 std::is_same<std::vector<char>,
1559 typename std::remove_cv<T>::type>::value ||
1560 std::is_same<std::vector<bool>,
1561 typename std::remove_cv<T>::type>::value ||
1562 std::is_same<std::vector<int16_t>,
1563 typename std::remove_cv<T>::type>::value ||
1564 std::is_same<std::vector<int32_t>,
1565 typename std::remove_cv<T>::type>::value ||
1566 std::is_same<std::vector<int64_t>,
1567 typename std::remove_cv<T>::type>::value ||
1568 std::is_same<std::vector<float>,
1569 typename std::remove_cv<T>::type>::value ||
1570 std::is_same<std::vector<double>,
1571 typename std::remove_cv<T>::type>::value ||
1572 std::is_same<std::vector<std::string>,
1573 typename std::remove_cv<T>::type>::value,
1574 boost::optional<T>>::type
1575 read(
const std::string& field_name)
1577 if (!cd_->has_field(field_name)) {
1580 return PortableReaderBase::read<T>(field_name);
1583 template<
typename T>
1584 boost::optional<T> read_portable(
const std::string& field_name);
1586 template<
typename T>
1587 boost::optional<std::vector<T>> read_portable_array(
1588 const std::string& field_name);
1591 template<
typename T>
1592 typename std::enable_if<
1593 std::is_same<int16_t, typename std::remove_cv<T>::type>::value,
1595 read_morphing(field_type current_field_type,
const std::string& field_name)
1597 switch (current_field_type) {
1598 case field_type::TYPE_BYTE:
1599 return PortableReaderBase::read<byte>(field_name);
1600 case field_type::TYPE_SHORT:
1601 return PortableReaderBase::read<int16_t>(field_name);
1603 BOOST_THROW_EXCEPTION(exception::hazelcast_serialization(
1604 "MorphingPortableReader::*",
"IncompatibleClassChangeError"));
1608 template<
typename T>
1609 typename std::enable_if<
1610 std::is_same<int32_t, typename std::remove_cv<T>::type>::value,
1612 read_morphing(field_type current_field_type,
const std::string& field_name)
1614 switch (current_field_type) {
1615 case field_type::TYPE_INT:
1616 return PortableReaderBase::read<int32_t>(field_name);
1617 case field_type::TYPE_CHAR:
1618 return PortableReaderBase::read<char>(field_name);
1620 return read_morphing<int16_t>(current_field_type, field_name);
1624 template<
typename T>
1625 typename std::enable_if<
1626 std::is_same<int64_t, typename std::remove_cv<T>::type>::value,
1628 read_morphing(field_type current_field_type,
const std::string& field_name)
1630 switch (current_field_type) {
1631 case field_type::TYPE_LONG:
1632 return PortableReaderBase::read<int64_t>(field_name);
1634 return read_morphing<int32_t>(current_field_type, field_name);
1638 template<
typename T>
1639 typename std::enable_if<
1640 std::is_same<float, typename std::remove_cv<T>::type>::value,
1642 read_morphing(field_type current_field_type,
const std::string& field_name)
1644 switch (current_field_type) {
1645 case field_type::TYPE_FLOAT:
1646 return PortableReaderBase::read<float>(field_name);
1648 return static_cast<float>(
1649 read_morphing<int32_t>(current_field_type, field_name));
1653 template<
typename T>
1654 typename std::enable_if<
1655 std::is_same<double, typename std::remove_cv<T>::type>::value,
1657 read_morphing(field_type current_field_type,
const std::string& field_name)
1659 switch (current_field_type) {
1660 case field_type::TYPE_DOUBLE:
1661 return PortableReaderBase::read<double>(field_name);
1662 case field_type::TYPE_FLOAT:
1663 return PortableReaderBase::read<float>(field_name);
1665 return static_cast<double>(
1666 read_morphing<int64_t>(current_field_type, field_name));
1671 class DefaultPortableWriter;
1672 class HAZELCAST_API PortableSerializer
1674 friend DefaultPortableWriter;
1677 PortableSerializer(PortableContext& portable_context);
1679 template<
typename T>
1680 T read_object(object_data_input& in);
1682 template<
typename T>
1683 T read(object_data_input& in, int32_t factory_id, int32_t class_id);
1685 template<
typename T>
1686 void write(
const T&
object, object_data_output& out);
1689 PortableContext& context_;
1691 template<
typename T>
1692 int find_portable_version(
int factory_id,
int class_id)
const;
1694 portable_reader create_reader(object_data_input& input,
1698 int portable_version);
1700 int32_t read_int(object_data_input& in)
const;
1702 template<
typename T>
1703 void write_internal(
const T&
object, object_data_output& out);
1705 template<
typename T>
1706 void write_internal(
const T&
object,
1707 std::shared_ptr<ClassDefinition>& cd,
1708 object_data_output& out);
1710 template<
typename T>
1711 std::shared_ptr<ClassDefinition> lookup_or_register_class_definition(
1715 class HAZELCAST_API DataSerializer
1718 template<
typename T>
1719 static boost::optional<T> read_object(object_data_input& in)
1721 bool identified = in.read<
bool>();
1723 BOOST_THROW_EXCEPTION(exception::hazelcast_serialization(
1724 "object_data_input::read_object<identified_data_serializer>",
1725 "Received data is not identified data serialized."));
1728 int32_t expectedFactoryId = hz_serializer<T>::get_factory_id();
1729 int32_t expectedClassId = hz_serializer<T>::get_class_id();
1730 int32_t factoryId = in.read<int32_t>();
1731 int32_t classId = in.read<int32_t>();
1732 if (expectedFactoryId != factoryId || expectedClassId != classId) {
1733 BOOST_THROW_EXCEPTION(exception::hazelcast_serialization(
1734 "object_data_input::read_object<identified_data_serializer>",
1735 (boost::format(
"Factory id %1% and class id %2% of data do not "
1737 "factory id %3% and class id %4%!") %
1738 factoryId % classId % expectedFactoryId % expectedClassId)
1742 return boost::make_optional(hz_serializer<T>::read_data(in));
1745 template<
typename T>
1746 static void write(
const T&
object, object_data_output& out);
1749 int32_t read_int(object_data_input& in)
const;
1752 class HAZELCAST_API DefaultPortableWriter
1755 DefaultPortableWriter(PortableSerializer& portable_ser,
1756 std::shared_ptr<ClassDefinition> cd,
1757 object_data_output& output);
1759 object_data_output& get_raw_data_output();
1761 template<
typename T>
1762 void write(
const std::string& field_name, T value)
1764 typedef typename std::remove_pointer<
typename std::remove_reference<
1765 typename std::remove_cv<T>::type>::type>::type value_type;
1766 set_position(field_name, PortableContext::get_type<value_type>());
1767 object_data_output_.write(value);
1772 template<
typename T>
1773 void write_null_portable(
const std::string& field_name);
1775 template<
typename T>
1776 void write_portable(
const std::string& field_name,
const T* portable);
1778 template<
typename T>
1779 void write_portable_array(
const std::string& field_name,
1780 const std::vector<T>* values);
1783 FieldDefinition
const& set_position(
const std::string& field_name,
1784 field_type field_type);
1786 template<
typename T>
1787 void check_portable_attributes(
const FieldDefinition& fd);
1790 PortableSerializer& portable_serializer_;
1791 object_data_output& object_data_output_;
1794 std::unordered_set<std::string> written_fields_;
1795 std::shared_ptr<ClassDefinition> cd_;
1802 #include "hazelcast/client/serialization/pimpl/compact.h"
1804 namespace hazelcast {
1806 namespace serialization {
1808 class HAZELCAST_API SerializationService :
public util::Disposable
1811 SerializationService(
const serialization_config& config);
1813 PortableSerializer& get_portable_serializer();
1815 compact_stream_serializer& get_compact_serializer();
1817 DataSerializer& get_data_serializer();
1819 template<
typename T>
1820 inline data to_data(
const T*
object)
1822 object_data_output output(
1823 serialization_config_.get_byte_order(),
1825 &portable_serializer_,
1826 &compact_serializer_,
1827 serialization_config_.get_global_serializer());
1829 write_hash<T>(
object, output);
1831 output.write_object<T>(object);
1833 return { std::move(output).to_byte_array() };
1836 template<
typename T>
1837 inline data to_data(
const T&
object)
1839 object_data_output output(
1840 serialization_config_.get_byte_order(),
1842 &portable_serializer_,
1843 &compact_serializer_,
1844 serialization_config_.get_global_serializer());
1846 write_hash<T>(&
object, output);
1848 output.write_object<T>(object);
1850 return { std::move(output).to_byte_array() };
1853 template<
typename T>
1854 inline std::shared_ptr<data> to_shared_data(
const T*
object)
1856 if (NULL ==
object) {
1857 return std::shared_ptr<data>();
1859 return std::shared_ptr<data>(
new data(to_data<T>(
object)));
1862 template<
typename T>
1863 inline boost::optional<T> to_object(
const data* data)
1868 return to_object<T>(*data);
1871 template<
typename T>
1872 typename std::enable_if<
1873 !(std::is_same<T, const char*>::value ||
1874 std::is_same<T, const char*>::value ||
1875 std::is_same<T, typed_data>::value),
1876 boost::optional<T>>::type
inline to_object(
const data& data)
1878 if (is_null_data(data)) {
1882 int32_t typeId = data.get_type();
1886 object_data_input objectDataInput(
1887 serialization_config_.get_byte_order(),
1888 data.to_byte_array(),
1890 portable_serializer_,
1891 compact_serializer_,
1893 serialization_config_.get_global_serializer());
1894 return objectDataInput.read_object<T>(typeId);
1897 template<
typename T>
1898 typename std::enable_if<
1899 std::is_same<T, typed_data>::value,
1900 boost::optional<T>>::type
inline to_object(
const data& d)
1902 return boost::make_optional(typed_data(data(d), *
this));
1905 template<
typename T>
1906 typename std::enable_if<
1907 std::is_same<T, const char*>::value,
1908 boost::optional<std::string>>::type
inline to_object(
const data& data)
1910 return to_object<std::string>(data);
1913 template<
typename T>
1914 typename std::enable_if<
1915 std::is_array<T>::value &&
1916 std::is_same<typename std::remove_all_extents<T>::type,
char>::value,
1917 boost::optional<std::string>>::type
inline to_object(
const data& data)
1919 return to_object<std::string>(data);
1922 template<
typename T>
1923 inline std::shared_ptr<data> to_shared_object(
1924 const std::shared_ptr<data>& data)
1929 byte get_version()
const;
1931 object_type get_object_type(
const data* data);
1936 void dispose()
override;
1938 object_data_output new_output_stream();
1941 SerializationService(
const SerializationService&) =
delete;
1943 SerializationService& operator=(
const SerializationService&) =
delete;
1945 const serialization_config& serialization_config_;
1946 PortableContext portable_context_;
1947 serialization::pimpl::PortableSerializer portable_serializer_;
1948 serialization::pimpl::compact_stream_serializer compact_serializer_;
1949 serialization::pimpl::DataSerializer data_serializer_;
1951 static bool is_null_data(
const data& data);
1953 template<
typename T>
1954 void write_hash(
const partition_aware_marker* obj, data_output& out)
1956 typedef typename T::KEY_TYPE PK_TYPE;
1957 const partition_aware<PK_TYPE>* partitionAwareObj =
1958 static_cast<const partition_aware<PK_TYPE>*
>(obj);
1959 const PK_TYPE* pk = partitionAwareObj->get_partition_key();
1961 data partitionKey = to_data<PK_TYPE>(pk);
1962 out.write<int32_t>(partitionKey.get_partition_hash());
1966 template<
typename T>
1967 void write_hash(
const void* obj, data_output& out)
1969 out.write(0, boost::endian::order::big);
1975 SerializationService::to_data(
const char*
object);
1988 const std::shared_ptr<ClassDefinition>& cd,
1989 bool is_default_reader);
1995 template<
typename T>
1996 typename std::enable_if<
1997 std::is_same<int16_t, typename std::remove_cv<T>::type>::value ||
1998 std::is_same<int32_t, typename std::remove_cv<T>::type>::value ||
1999 std::is_same<int64_t, typename std::remove_cv<T>::type>::value ||
2000 std::is_same<float, typename std::remove_cv<T>::type>::value ||
2001 std::is_same<double, typename std::remove_cv<T>::type>::value ||
2002 std::is_same<byte, typename std::remove_cv<T>::type>::value ||
2003 std::is_same<char, typename std::remove_cv<T>::type>::value ||
2004 std::is_same<char16_t, typename std::remove_cv<T>::type>::value ||
2005 std::is_same<bool, typename std::remove_cv<T>::type>::value ||
2006 std::is_same<std::string, typename std::remove_cv<T>::type>::value,
2008 read(
const std::string& field_name)
2010 if (is_default_reader_)
2011 return default_portable_reader_->read<T>(field_name);
2012 return morphing_portable_reader_->read<T>(field_name);
2019 template<
typename T>
2020 typename std::enable_if<
2021 std::is_same<std::vector<byte>,
2022 typename std::remove_cv<T>::type>::value ||
2023 std::is_same<std::vector<char>,
2024 typename std::remove_cv<T>::type>::value ||
2025 std::is_same<std::vector<bool>,
2026 typename std::remove_cv<T>::type>::value ||
2027 std::is_same<std::vector<int16_t>,
2028 typename std::remove_cv<T>::type>::value ||
2029 std::is_same<std::vector<int32_t>,
2030 typename std::remove_cv<T>::type>::value ||
2031 std::is_same<std::vector<int64_t>,
2032 typename std::remove_cv<T>::type>::value ||
2033 std::is_same<std::vector<float>,
2034 typename std::remove_cv<T>::type>::value ||
2035 std::is_same<std::vector<double>,
2036 typename std::remove_cv<T>::type>::value ||
2037 std::is_same<std::vector<std::string>,
2038 typename std::remove_cv<T>::type>::value,
2039 boost::optional<T>>::type
2040 read(
const std::string& field_name)
2042 if (is_default_reader_)
2043 return default_portable_reader_->read<T>(field_name);
2044 return morphing_portable_reader_->read<T>(field_name);
2052 template<
typename T>
2053 boost::optional<T> read_portable(
const std::string& field_name);
2060 template<
typename T>
2061 boost::optional<std::vector<T>> read_portable_array(
2062 const std::string& field_name);
2081 bool is_default_reader_;
2082 boost::optional<pimpl::DefaultPortableReader> default_portable_reader_;
2083 boost::optional<pimpl::MorphingPortableReader> morphing_portable_reader_;
2097 portable_writer(pimpl::DefaultPortableWriter* default_portable_writer);
2102 portable_writer(pimpl::ClassDefinitionWriter* class_definition_writer);
2104 template<
typename T>
2105 void write(
const std::string& field_name, T value)
2107 if (is_default_writer_) {
2108 default_portable_writer_->write(field_name, value);
2110 class_definition_writer_->write(field_name, value);
2127 template<
typename T>
2128 void write_null_portable(
const std::string& field_name);
2136 template<
typename T>
2137 void write_portable(
const std::string& field_name,
const T* portable);
2145 template<
typename T>
2146 void write_portable_array(
const std::string& field_name,
2147 const std::vector<T>* values);
2161 pimpl::DefaultPortableWriter* default_portable_writer_;
2162 pimpl::ClassDefinitionWriter* class_definition_writer_;
2163 bool is_default_writer_;
2166 template<
typename T>
2170 if (is_default_reader_)
2171 return default_portable_reader_->read_portable<T>(field_name);
2172 return morphing_portable_reader_->read_portable<T>(field_name);
2181 template<
typename T>
2182 boost::optional<std::vector<T>>
2185 if (is_default_reader_)
2186 return default_portable_reader_->read_portable_array<T>(field_name);
2187 return morphing_portable_reader_->read_portable_array<T>(field_name);
2190 template<
typename T>
2194 if (is_default_writer_)
2195 return default_portable_writer_->write_null_portable<T>(field_name);
2196 return class_definition_writer_->write_null_portable<T>(field_name);
2205 template<
typename T>
2210 if (is_default_writer_)
2211 return default_portable_writer_->write_portable(field_name, portable);
2212 return class_definition_writer_->write_portable(field_name, portable);
2221 template<
typename T>
2224 const std::vector<T>* values)
2226 if (is_default_writer_)
2227 return default_portable_writer_->write_portable_array(field_name,
2229 return class_definition_writer_->write_portable_array(field_name, values);
2232 template<
typename T>
2234 object_data_output::write_object(
const T*
object)
2240 write(
static_cast<int32_t
>(
2241 pimpl::serialization_constants::CONSTANT_TYPE_NULL),
2242 boost::endian::order::big);
2246 write_object<T>(*
object);
2249 template<
typename T>
2250 typename std::enable_if<
2251 !(std::is_array<T>::value &&
2252 std::is_same<typename std::remove_all_extents<T>::type,
char>::value),
2254 object_data_output::write_object(
const boost::optional<T>&
object)
2260 write(
static_cast<int32_t
>(
2261 pimpl::serialization_constants::CONSTANT_TYPE_NULL),
2262 boost::endian::order::big);
2266 write_object<T>(
object.value());
2269 template<
typename T>
2270 typename std::enable_if<
2271 std::is_base_of<identified_data_serializer, hz_serializer<T>>::value,
2272 void>::type
inline object_data_output::write_object(
const T&
object)
2278 static_cast<int32_t
>(pimpl::serialization_constants::CONSTANT_TYPE_DATA),
2279 boost::endian::order::big);
2280 pimpl::DataSerializer::write<T>(
object, *
this);
2283 template<
typename T>
2284 typename std::enable_if<
2285 std::is_base_of<portable_serializer, hz_serializer<T>>::value,
2286 void>::type
inline object_data_output::write_object(
const T&
object)
2291 write(
static_cast<int32_t
>(
2292 pimpl::serialization_constants::CONSTANT_TYPE_PORTABLE),
2293 boost::endian::order::big);
2294 portable_serializer_->write<T>(object, *
this);
2297 template<
typename T>
2298 typename std::enable_if<
2299 std::is_base_of<compact_serializer, hz_serializer<T>>::value,
2300 void>::type
inline object_data_output::write_object(
const T&
object)
2305 write(
static_cast<int32_t
>(
2306 pimpl::serialization_constants::CONSTANT_TYPE_COMPACT),
2307 boost::endian::order::big);
2308 compact_serializer_->write<T>(object, *
this);
2311 template<
typename T>
2312 typename std::enable_if<
2313 std::is_base_of<builtin_serializer, hz_serializer<T>>::value,
2314 void>::type
inline object_data_output::write_object(
const T&
object)
2319 write(
static_cast<int32_t
>((hz_serializer<T>::get_type_id())),
2320 boost::endian::order::big);
2324 template<
typename T>
2325 typename std::enable_if<
2326 std::is_array<T>::value &&
2327 std::is_same<typename std::remove_all_extents<T>::type,
char>::value,
2328 void>::type
inline object_data_output::write_object(
const T&
object)
2330 write_object(std::string(
object));
2333 template<
typename T>
2334 typename std::enable_if<
2335 std::is_base_of<custom_serializer, hz_serializer<T>>::value,
2336 void>::type
inline object_data_output::write_object(
const T&
object)
2341 static_assert(hz_serializer<T>::get_type_id() > 0,
2342 "Custom serializer type id can not be negative!");
2343 write(hz_serializer<T>::get_type_id(), boost::endian::order::big);
2344 hz_serializer<T>::write(
object, *
this);
2353 template<
typename T>
2354 typename std::enable_if<
2355 !(std::is_base_of<builtin_serializer, hz_serializer<T>>::value ||
2356 std::is_base_of<identified_data_serializer, hz_serializer<T>>::value ||
2357 std::is_base_of<portable_serializer, hz_serializer<T>>::value ||
2358 std::is_base_of<compact_serializer, hz_serializer<T>>::value ||
2359 std::is_base_of<custom_serializer, hz_serializer<T>>::value ||
2360 (std::is_array<T>::value &&
2361 std::is_same<typename std::remove_all_extents<T>::type,
char>::value)),
2362 void>::type
inline object_data_output::write_object(
const T
object)
2364 if (!global_serializer_) {
2365 throw exception::hazelcast_serialization(
2366 "object_data_output::write_object",
2367 (boost::format(
"No serializer found for type(%1%).") %
2374 write(
static_cast<int32_t
>(global_serializer::get_type_id()),
2375 boost::endian::order::big);
2376 global_serializer_->write(boost::any(std::move(
object)), *
this);
2379 template<
typename T>
2380 typename std::enable_if<
2381 !(std::is_array<T>::value &&
2382 std::is_same<typename std::remove_all_extents<T>::type,
char>::value),
2385 int32_t typeId = read(boost::endian::order::big);
2386 if (
static_cast<int32_t
>(
2387 pimpl::serialization_constants::CONSTANT_TYPE_NULL) == typeId) {
2390 return read_object<T>(typeId);
2393 template<
typename T>
2394 typename std::enable_if<
2395 std::is_array<T>::value &&
2396 std::is_same<typename std::remove_all_extents<T>::type,
char>::value,
2399 return read_object<std::string>();
2402 template<
typename T>
2403 typename std::enable_if<
2404 std::is_base_of<identified_data_serializer, hz_serializer<T>>::value,
2408 if (type_id !=
static_cast<int32_t
>(
2409 pimpl::serialization_constants::CONSTANT_TYPE_DATA)) {
2410 BOOST_THROW_EXCEPTION(exception::hazelcast_serialization(
2411 "object_data_input::read_object<identified_data_serializer>",
2412 (boost::format(
"The associated serializer Serializer<T> is "
2413 "identified_data_serializer "
2414 "but received data type id is %1%") %
2419 return data_serializer_.read_object<T>(*this);
2422 template<
typename T>
2423 typename std::enable_if<
2424 std::is_base_of<portable_serializer, hz_serializer<T>>::value,
2428 if (type_id !=
static_cast<int32_t
>(
2429 pimpl::serialization_constants::CONSTANT_TYPE_PORTABLE)) {
2430 BOOST_THROW_EXCEPTION(exception::hazelcast_serialization(
2431 "object_data_input::read_object<portable_serializer>",
2433 "The associated serializer Serializer<T> is portable_serializer "
2434 "but received data type id is %1%") %
2439 return portable_serializer_.read_object<T>(*this);
2442 template<
typename T>
2443 typename std::enable_if<
2444 std::is_base_of<compact_serializer, hz_serializer<T>>::value,
2448 return compact_serializer_.template read<T>(*
this);
2451 template<
typename T>
2452 typename std::enable_if<
2453 std::is_base_of<custom_serializer, hz_serializer<T>>::value,
2457 if (type_id != hz_serializer<T>::get_type_id()) {
2458 BOOST_THROW_EXCEPTION(exception::hazelcast_serialization(
2459 "object_data_input::read_object<>",
2460 (boost::format(
"The associated serializer Serializer<T> type id %1% "
2462 "received data type id is %2%") %
2463 hz_serializer<T>::get_type_id() % type_id)
2467 return boost::optional<T>(hz_serializer<T>::read(*
this));
2470 template<
typename T>
2471 typename std::enable_if<
2472 std::is_base_of<builtin_serializer, hz_serializer<T>>::value,
2476 assert(type_id ==
static_cast<int32_t
>(hz_serializer<T>::get_type_id()));
2478 return boost::optional<T>(read<T>());
2481 template<
typename T>
2482 typename std::enable_if<
2483 !(std::is_base_of<identified_data_serializer, hz_serializer<T>>::value ||
2484 std::is_base_of<portable_serializer, hz_serializer<T>>::value ||
2485 std::is_base_of<compact_serializer, hz_serializer<T>>::value ||
2486 std::is_base_of<builtin_serializer, hz_serializer<T>>::value ||
2487 std::is_base_of<custom_serializer, hz_serializer<T>>::value),
2491 if (!global_serializer_) {
2492 throw exception::hazelcast_serialization(
2493 "object_data_input::read_object",
2494 (boost::format(
"No serializer found for type %1%.") %
2499 if (type_id !=
static_cast<int32_t
>(global_serializer_->get_type_id())) {
2500 BOOST_THROW_EXCEPTION(exception::hazelcast_serialization(
2501 "object_data_input::read_object<>",
2502 (boost::format(
"The global serializer type id %1% does not match "
2503 "received data type id is %2%") %
2504 static_cast<int32_t
>(global_serializer_->get_type_id()) % type_id)
2508 return boost::optional<T>(
2509 boost::any_cast<T>(std::move(global_serializer_->read(*
this))));
2515 SerializationService::to_data(
const typed_data*
object);
2517 template<
typename T>
2519 DefaultPortableReader::read_portable(
const std::string& field_name)
2521 return get_portable_instance<T>(field_name);
2524 template<
typename T>
2525 boost::optional<std::vector<T>>
2526 DefaultPortableReader::read_portable_array(
const std::string& field_name)
2528 PortableReaderBase::set_position(field_name,
2529 field_type::TYPE_PORTABLE_ARRAY);
2531 data_input_->read<int32_t>();
2532 std::vector<T> portables;
2534 set_position(field_name, field_type::TYPE_PORTABLE_ARRAY);
2536 int32_t len = data_input_->read<int32_t>();
2537 if (len == util::Bits::NULL_ARRAY) {
2540 int32_t factoryId = data_input_->read<int32_t>();
2541 int32_t classId = data_input_->read<int32_t>();
2543 check_factory_and_class(cd_->get_field(field_name), factoryId, classId);
2546 int offset = data_input_->position();
2547 for (
int i = 0; i < len; i++) {
2548 data_input_->position(offset + i * util::Bits::INT_SIZE_IN_BYTES);
2549 int32_t start = data_input_->read<int32_t>();
2550 data_input_->position(start);
2552 portables.push_back(
2553 portable_serializer_->read<T>(*data_input_, factoryId, classId));
2559 template<
typename T>
2561 MorphingPortableReader::read_portable(
const std::string& field_name)
2563 return get_portable_instance<T>(field_name);
2566 template<
typename T>
2567 boost::optional<std::vector<T>>
2568 MorphingPortableReader::read_portable_array(
const std::string& field_name)
2570 PortableReaderBase::set_position(field_name,
2571 field_type::TYPE_PORTABLE_ARRAY);
2573 data_input_->read<int32_t>();
2574 std::vector<T> portables;
2576 set_position(field_name, field_type::TYPE_PORTABLE_ARRAY);
2578 int32_t len = data_input_->read<int32_t>();
2579 if (len == util::Bits::NULL_ARRAY) {
2582 int32_t factoryId = data_input_->read<int32_t>();
2583 int32_t classId = data_input_->read<int32_t>();
2585 check_factory_and_class(cd_->get_field(field_name), factoryId, classId);
2588 portables.reserve(
static_cast<size_t>(len));
2589 int offset = data_input_->position();
2590 for (
int i = 0; i < len; i++) {
2591 data_input_->position(offset + i * util::Bits::INT_SIZE_IN_BYTES);
2592 int32_t start = data_input_->read<int32_t>();
2593 data_input_->position(start);
2595 portables.emplace_back(
2596 portable_serializer_->read<T>(*data_input_, factoryId, classId));
2600 return boost::make_optional(std::move(portables));
2603 template<
typename T>
2605 PortableSerializer::read_object(object_data_input& in)
2607 int32_t factoryId = read_int(in);
2608 int32_t classId = read_int(in);
2610 if (factoryId != hz_serializer<T>::get_factory_id() ||
2611 classId != hz_serializer<T>::get_class_id()) {
2612 BOOST_THROW_EXCEPTION(exception::hazelcast_serialization(
2613 "PortableSerializer::read_object",
2614 (boost::format(
"Received data (factory-class id)=(%1%, %2%) does not "
2615 "match expected factory-class id (%3%, %4%)") %
2616 factoryId % classId % hz_serializer<T>::get_factory_id() %
2617 hz_serializer<T>::get_class_id())
2620 return read<T>(in, factoryId, classId);
2623 template<
typename T>
2625 PortableSerializer::read(object_data_input& in,
2629 int version = in.read<int32_t>();
2631 int portableVersion = find_portable_version<T>(factory_id, class_id);
2633 portable_reader reader =
2634 create_reader(in, factory_id, class_id, version, portableVersion);
2635 T result = hz_serializer<T>::read_portable(reader);
2640 template<
typename T>
2642 PortableSerializer::write(
const T&
object, object_data_output& out)
2644 out.write<int32_t>(hz_serializer<T>::get_factory_id());
2645 out.write<int32_t>(hz_serializer<T>::get_class_id());
2647 write_internal(
object, out);
2650 template<
typename T>
2652 PortableSerializer::write_internal(
const T&
object, object_data_output& out)
2654 auto cd = context_.lookup_or_register_class_definition<T>(object);
2655 write_internal(
object, cd, out);
2658 template<
typename T>
2660 PortableSerializer::write_internal(
const T&
object,
2661 std::shared_ptr<ClassDefinition>& cd,
2662 object_data_output& out)
2664 out.write<int32_t>(cd->get_version());
2666 DefaultPortableWriter dpw(*
this, cd, out);
2667 portable_writer portableWriter(&dpw);
2668 hz_serializer<T>::write_portable(
object, portableWriter);
2669 portableWriter.end();
2672 template<
typename T>
2673 std::shared_ptr<ClassDefinition>
2674 PortableSerializer::lookup_or_register_class_definition(
const T& portable)
2676 return context_.lookup_or_register_class_definition<T>(portable);
2679 template<
typename T>
2681 PortableSerializer::find_portable_version(
int factory_id,
int class_id)
const
2683 int currentVersion = context_.get_class_version(factory_id, class_id);
2684 if (currentVersion < 0) {
2686 PortableVersionHelper::get_version<T>(context_.get_version());
2687 if (currentVersion > 0) {
2688 context_.set_class_version(factory_id, class_id, currentVersion);
2691 return currentVersion;
2694 template<
typename T>
2696 DataSerializer::write(
const T&
object, object_data_output& out)
2698 out.write<
bool>(
true);
2699 out.write<int32_t>(hz_serializer<T>::get_factory_id());
2700 out.write<int32_t>(hz_serializer<T>::get_class_id());
2701 hz_serializer<T>::write_data(
object, out);
2704 template<
typename T>
2705 std::shared_ptr<ClassDefinition>
2706 PortableContext::lookup_or_register_class_definition(
const T& portable)
2708 int portableVersion = PortableVersionHelper::get_version<T>(
2709 serialization_config_.get_portable_version());
2710 std::shared_ptr<ClassDefinition> cd =
2711 lookup_class_definition(hz_serializer<T>::get_factory_id(),
2712 hz_serializer<T>::get_class_id(),
2714 if (cd.get() == NULL) {
2715 ClassDefinitionBuilder classDefinitionBuilder(
2716 hz_serializer<T>::get_factory_id(),
2717 hz_serializer<T>::get_class_id(),
2719 ClassDefinitionWriter cdw(*
this, classDefinitionBuilder);
2720 portable_writer portableWriter(&cdw);
2721 hz_serializer<T>::write_portable(portable, portableWriter);
2722 cd = cdw.register_and_get();
2727 template<
typename T>
2729 PortableReaderBase::get_portable_instance(
const std::string& field_name)
2731 set_position(field_name, field_type::TYPE_PORTABLE);
2733 bool isNull = data_input_->read<
bool>();
2734 int32_t factoryId = data_input_->read<int32_t>();
2735 int32_t classId = data_input_->read<int32_t>();
2737 check_factory_and_class(cd_->get_field(field_name), factoryId, classId);
2742 return portable_serializer_->read<T>(*data_input_, factoryId, classId);
2746 template<
typename T>
2748 DefaultPortableWriter::write_null_portable(
const std::string& field_name)
2750 set_position(field_name, field_type::TYPE_PORTABLE);
2751 object_data_output_.write<
bool>(
true);
2752 object_data_output_.write<int32_t>(hz_serializer<T>::get_factory_id());
2753 object_data_output_.write<int32_t>(hz_serializer<T>::get_class_id());
2756 template<
typename T>
2758 DefaultPortableWriter::write_portable(
const std::string& field_name,
2761 FieldDefinition
const& fd =
2762 set_position(field_name, field_type::TYPE_PORTABLE);
2763 bool isNull = (
nullptr == portable);
2764 object_data_output_.write<
bool>(isNull);
2766 object_data_output_.write<int32_t>(hz_serializer<T>::get_factory_id());
2767 object_data_output_.write<int32_t>(hz_serializer<T>::get_class_id());
2770 check_portable_attributes<T>(fd);
2771 portable_serializer_.write_internal(*portable, object_data_output_);
2774 portable_serializer_.write(*portable, object_data_output_);
2777 template<
typename T>
2779 DefaultPortableWriter::write_portable_array(
const std::string& field_name,
2780 const std::vector<T>* values)
2782 FieldDefinition
const& fd =
2783 set_position(field_name, field_type::TYPE_PORTABLE_ARRAY);
2784 check_portable_attributes<T>(fd);
2787 (values ?
static_cast<int32_t
>(values->size()) : util::Bits::NULL_ARRAY);
2788 object_data_output_.write<int32_t>(len);
2790 object_data_output_.write<int32_t>(fd.get_factory_id());
2791 object_data_output_.write<int32_t>(fd.get_class_id());
2794 std::shared_ptr<ClassDefinition> classDefinition =
2795 portable_serializer_.lookup_or_register_class_definition<T>(
2797 size_t currentOffset = object_data_output_.position();
2798 object_data_output_.position(currentOffset +
2799 len * util::Bits::INT_SIZE_IN_BYTES);
2800 for (int32_t i = 0; i < len; i++) {
2801 size_t position = object_data_output_.position();
2802 object_data_output_.write_at(currentOffset +
2803 i * util::Bits::INT_SIZE_IN_BYTES,
2804 static_cast<int32_t
>(position));
2805 portable_serializer_.write_internal(
2806 (*values)[i], classDefinition, object_data_output_);
2811 template<
typename T>
2813 DefaultPortableWriter::check_portable_attributes(
const FieldDefinition& fd)
2815 if (fd.get_factory_id() != hz_serializer<T>::get_factory_id()) {
2816 BOOST_THROW_EXCEPTION(exception::hazelcast_serialization(
2817 "DefaultPortableWriter::::checkPortableAttributes",
2818 (boost::format(
"Wrong Portable type! Expected factory-id: %1%, "
2819 "Actual factory-id: %2%") %
2820 fd.get_factory_id() % hz_serializer<T>::get_factory_id())
2823 if (fd.get_class_id() != hz_serializer<T>::get_class_id()) {
2824 BOOST_THROW_EXCEPTION(exception::hazelcast_serialization(
2825 "DefaultPortableWriter::::checkPortableAttributes",
2826 (boost::format(
"Wrong Portable type! Expected class-id: %1%, Actual "
2828 fd.get_class_id() % hz_serializer<T>::get_class_id())
2833 template<
typename T>
2834 std::shared_ptr<ClassDefinition>
2835 ClassDefinitionWriter::create_nested_class_def(
const T& portable)
2837 int version = PortableVersionHelper::get_version<T>(context_.get_version());
2838 ClassDefinitionBuilder definitionBuilder(hz_serializer<T>::get_factory_id(),
2839 hz_serializer<T>::get_class_id(),
2842 ClassDefinitionWriter nestedWriter(context_, definitionBuilder);
2843 portable_writer portableWriter(&nestedWriter);
2844 hz_serializer<T>::write_portable(portable, portableWriter);
2845 return context_.register_class_definition(definitionBuilder.build());
2850 template<
typename T>
2854 return ss_->to_object<T>(data_);
2859 #include "hazelcast/client/serialization/pimpl/compact.i.h"
2861 #if defined(WIN32) || defined(_WIN32) || defined(WIN64) || defined(_WIN64)
2862 #pragma warning(pop)
hazelcast_json_value is a wrapper for Json formatted strings.
ClassDefinitionBuilder is used to build and register ClassDefinitions manually.
ClassDefinition defines a class schema for portable classes.
Provides a mean of reading portable fields from a binary in form of java primitives arrays of java pr...
std::enable_if< std::is_same< int16_t, typename std::remove_cv< T >::type >::value||std::is_same< int32_t, typename std::remove_cv< T >::type >::value||std::is_same< int64_t, typename std::remove_cv< T >::type >::value||std::is_same< float, typename std::remove_cv< T >::type >::value||std::is_same< double, typename std::remove_cv< T >::type >::value||std::is_same< byte, typename std::remove_cv< T >::type >::value||std::is_same< char, typename std::remove_cv< T >::type >::value||std::is_same< char16_t, typename std::remove_cv< T >::type >::value||std::is_same< bool, typename std::remove_cv< T >::type >::value||std::is_same< std::string, typename std::remove_cv< T >::type >::value, T >::type read(const std::string &field_name)
boost::optional< std::vector< T > > read_portable_array(const std::string &field_name)
std::enable_if< std::is_same< std::vector< byte >, typename std::remove_cv< T >::type >::value||std::is_same< std::vector< char >, typename std::remove_cv< T >::type >::value||std::is_same< std::vector< bool >, typename std::remove_cv< T >::type >::value||std::is_same< std::vector< int16_t >, typename std::remove_cv< T >::type >::value||std::is_same< std::vector< int32_t >, typename std::remove_cv< T >::type >::value||std::is_same< std::vector< int64_t >, typename std::remove_cv< T >::type >::value||std::is_same< std::vector< float >, typename std::remove_cv< T >::type >::value||std::is_same< std::vector< double >, typename std::remove_cv< T >::type >::value||std::is_same< std::vector< std::string >, typename std::remove_cv< T >::type >::value, boost::optional< T > >::type read(const std::string &field_name)
boost::optional< T > read_portable(const std::string &field_name)
Provides a mean of writing portable fields to a binary in form of java primitives arrays of java prim...
void write_null_portable(const std::string &field_name)
To write a null portable value.
void write_portable_array(const std::string &field_name, const std::vector< T > *values)
void write_portable(const std::string &field_name, const T *portable)
typed_data class is a wrapper class for the serialized binary data.
boost::optional< T > get() const
Deserializes the underlying binary data and produces the object of type T.
An arbitrary precision and scale floating point number.
Classes derived from this class should implement the following static methods: static int32_t get_cla...
Classes derived from this class should implement the following static methods: static int32_t get_cla...