Ok perfect! F.D.
On Thu, Aug 2, 2018 at 3:11 PM Igor Sapego <[email protected]> wrote: > 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. >>>>> >>>>>
