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...