我正在尝试使用 GridGain C++ 瘦客户端从用 C++ 编写的项目访问 GridGain 服务器:https://ignite.apache.org/docs/latest/thin-clients/cpp-thin-client 只要我使用基本类型(整数、std::string 等),一切都可以正常工作。 然而,更复杂的类型(任何类型的“结构”)需要序列化。序列化概述如下:https://ignite.apache.org/docs/latest/cpp-specific/cpp-serialization。该页面似乎提供了代码片段,但不是完整的示例。如果我尝试从该页面复制并编译代码:
class Address
{
friend struct ignite::binary::BinaryType<Address>;
public:
Address() { }
Address(const std::string& street, int32_t zip) :
street(street), zip(zip) { }
const std::string& GetStreet() const
{
return street;
}
int32_t GetZip() const
{
return zip;
}
private:
std::string street;
int32_t zip;
};
template<>
struct ignite::binary::BinaryType<Address>
{
static int32_t GetTypeId()
{
return GetBinaryStringHashCode("Address");
}
static void GetTypeName(std::string& name)
{
name = "Address";
}
static int32_t GetFieldId(const char* name)
{
return GetBinaryStringHashCode(name);
}
static bool IsNull(const Address& obj)
{
return obj.GetZip() && !obj.GetStreet().empty();
}
static void GetNull(Address& dst)
{
dst = Address();
}
static void Write(BinaryWriter& writer, const Address& obj)
{
writer.WriteString("street", obj.GetStreet());
writer.WriteInt32("zip", obj.GetZip());
}
static void Read(BinaryReader& reader, Address& dst)
{
dst.street = reader.ReadString("street");
dst.zip = reader.ReadInt32("zip");
}
};
它给出编译错误:
\ggainserializer.h(75): 错误 C2027: 使用未定义类型 'ignite::binary::BinaryReader' \install\gridgain\include\ignite\impl inary inary_reader_impl.h(46): 注意:参见 'ignite::binary::BinaryReader' 的声明 \ggainserializer.h(76): 错误 C2027: 使用未定义类型 'ignite::binary::BinaryReader' \install\gridgain\include\ignite\impl inary inary_reader_impl.h(46): 注意:参见 'ignite::binary::BinaryReader' 的声明 4>GGainSerializer.cpp ...
API是基于模板的,似乎缺少一些东西。
有人能够实现自定义 C++ 类型的序列化工作吗? ?如果是这样,请提供一段使用自定义类型序列化器 – C++“struct”-ures 写入和读取 Ignite(或相同的 GridGain)的示例代码。理想情况下,该代码应该是完整的,以便我可以编译它并逐步执行(调试)。 谢谢。
我们再次尝试按照此处的说明进行操作https://ignite.apache.org/docs/latest/cpp-specific/cpp-serialization但它们似乎不起作用。
非常感谢您的链接!查看它以及存储库中的其他文件,我终于能够完成 GridGain/Ignite 自定义类型序列化工作。我花了一周的时间才到达这里,所以将概述我所面临的问题和解决方案,因为它可能会帮助其他人:
我能找到的关于自定义类型的 C++ 序列化的唯一官方 Ignite/GridGain 文档是:https://ignite.apache.org/docs/latest/cpp-specific/cpp-serialization。不幸的是,如果没有引用您善意提供的存储库中的那些代码示例。在我看来,这些样本是关键。
上述文档中的代码存在错误,导致 GridGain 服务器抛出异常。
static bool IsNull(const Address& obj) { return obj.GetZip() && !obj.GetStreet().empty(); }
应该是:
return !(obj.GetZip() && !obj.GetStreet().empty());
由于您显然是 Ignite 团队的成员(根据您在上述 Git 存储库中的提交),请澄清以下内容来帮助我们:
诚挚抱歉问了这么多问题。 C++ 文档似乎不完整。因此,如果无法深入挖掘 Ignite/GridGain 代码,唯一的选择就是询问 Ignite 团队成员或支持人员。
再次非常感谢您!