You may also use rawWriter. The point is, you should not use non-raw user, when you already started using raw.
Best Regards, Igor On Thu, Aug 2, 2018 at 3:58 PM F.D. <[email protected]> wrote: > My fault!!! I modified the code in this way: > > static void Write(BinaryWriter& writer, const Calculation& obj) > { > writer.WriteBool("local_log", obj.local_log_); > writer.WriteString("service_name", obj.service_name_); > > auto sa_writer = writer.WriteStringArray("input"); > for(const auto &s : obj.input_) > sa_writer.Write(s); > sa_writer.Close(); > } > > static void Read(BinaryReader& reader, Calculation& dst) > { > dst.local_log_ = reader.ReadBool("local_log"); > dst.service_name_ = reader.ReadString("service_name"); > > auto sa_reader = reader.ReadStringArray("input"); > while(sa_reader.HasNext()) > dst.input_.push_back(sa_reader.GetNext()); > } > > and now work perfectly! > > Sorry and thanks again! > F.D. > > > > On Thu, Aug 2, 2018 at 2:52 PM F.D. <[email protected]> wrote: > >> Here we go. Maybe the problem is the vector<std::string> inside the class >> Calculation. >> >> namespace ignite { >> namespace binary { >> >> template<> >> struct BinaryType<Calculation> >> { >> static int32_t GetTypeId() >> { >> return GetBinaryStringHashCode("Calculation"); >> } >> >> static void GetTypeName(std::string& dst) >> { >> dst = "Calculation"; >> } >> >> static int32_t GetFieldId(const char* name) >> { >> return GetBinaryStringHashCode(name); >> } >> >> static int32_t GetHashCode(const Calculation& obj) >> { >> return 0; >> } >> >> static bool IsNull(const Calculation& obj) >> { >> return false; >> } >> >> static void GetNull(Calculation& dst) >> { >> dst = Calculation(); >> } >> >> static void Write(BinaryWriter& writer, const Calculation& obj) >> { >> writer.RawWriter().WriteBool(obj.local_log_); >> writer.RawWriter().WriteString(obj.service_name_); >> >> auto sa_writer = writer.WriteStringArray("input"); >> for(const auto &s : obj.input_) >> sa_writer.Write(s); >> sa_writer.Close(); >> } >> >> static void Read(BinaryReader& reader, Calculation& dst) >> { >> dst.local_log_ = reader.RawReader().ReadBool(); >> dst.service_name_ = reader.RawReader().ReadString(); >> >> auto sa_reader = reader.ReadStringArray("input"); >> while(sa_reader.HasNext()) >> dst.input_.push_back(sa_reader.GetNext()); >> } >> }; >> >> template<> >> struct BinaryType<std::vector<std::string>> >> { >> typedef std::vector<std::string> value_type; >> >> static int32_t GetTypeId() >> { >> return GetBinaryStringHashCode("VectorOfString"); >> } >> >> static void GetTypeName(std::string& dst) >> { >> dst = "VectorOfString"; >> } >> >> static int32_t GetFieldId(const char* name) >> { >> return GetBinaryStringHashCode(name); >> } >> >> static int32_t GetHashCode(const std::vector<std::string> &obj) >> { >> return 0; >> } >> >> static bool IsNull(const std::vector<std::string> &obj) >> { >> return !obj.size(); >> } >> >> static void GetNull(std::vector<std::string> &dst) >> { >> dst = value_type(); >> } >> >> static void Write(BinaryWriter &writer, const std::vector<std::string> >> &obj) >> { >> auto sa_writer = writer.WriteStringArray("items"); >> for(const auto &s : obj) >> sa_writer.Write(s); >> sa_writer.Close(); >> } >> >> static void Read(BinaryReader &reader, std::vector<std::string> &dst) >> { >> auto sa_reader = reader.ReadStringArray("items"); >> while(sa_reader.HasNext()) >> dst.push_back(sa_reader.GetNext()); >> } >> }; >> >> } } // namespace ignite binary >> >> Thanks, >> F.D. >> >> >> On Thu, Aug 2, 2018 at 10:14 AM Igor Sapego <[email protected]> wrote: >> >>> Hi, >>> >>> Can you show how you define BinaryType? Because the error >>> you are receiving is related to serialization/deserialization process. >>> >>> Best Regards, >>> Igor >>> >>> >>> On Thu, Aug 2, 2018 at 9:15 AM F.D. <[email protected]> wrote: >>> >>>> Hi Igniters, >>>> >>>> finally, I've compiled my code and run my test. But after I call my >>>> closure I got this errors: "Operation cannot be performed in raw mode.", >>>> and unfortunally I've no idea what it does mean. >>>> >>>> This is the code of call: >>>> >>>> IgniteConfiguration cfg; >>>> std::string home = getenv("IGNITE_HOME"); >>>> fs::path cfg_path = fs::path(home) / "platforms" / "cpp" / >>>> "client_config.xml"; >>>> cfg.springCfgPath = cfg_path.string(); >>>> >>>> ignite = Ignition::Start(cfg); >>>> >>>> IgniteBinding binding = ignite.GetBinding(); >>>> binding.RegisterComputeFunc<Calculation>(); >>>> >>>> Compute compute = ignite.GetCompute(); >>>> >>>> [...] >>>> >>>> Calculation functor(name, args, false); >>>> auto fut = compute.CallAsync<std::string>(functor); >>>> >>>> [...] >>>> >>>> And Calculation is: >>>> >>>> class CalculationEngineIgniteServer: public >>>> ignite::compute::ComputeFunc<std::string> >>>> { >>>> friend struct >>>> ignite::binary::BinaryType<CalculationEngineIgniteServer>; >>>> public: >>>> CalculationEngineIgniteServer( >>>> ) = default; >>>> CalculationEngineIgniteServer( >>>> const std::string &name, >>>> const std::vector<std::string> &input, >>>> bool localLog >>>> ); >>>> >>>> virtual std::string Call(); >>>> >>>> private: >>>> std::string name_; >>>> bool local_log_; >>>> >>>> std::vector<std::string> input_; >>>> }; >>>> >>>> Then I defined BinaryType for Calculation and for >>>> std::vector<std::string>. I don't understand where I miss. >>>> >>>> Thanks, >>>> F.D. >>>> >>>>
