如何使用Ignite C++瘦客户端编码自定义Decimal对象(Protobuf生成)为二进制格式
Ignite C++瘦客户端实现Decimal对象二进制编解码方案
问题说明
Ignite C++瘦客户端未提供像Java客户端那样直接读写Decimal的API,需手动实现自定义DecimalValue类型的二进制编解码逻辑,以完成包含该类型的Product对象序列化与反序列化。
定义的Protobuf结构
message Product { int32 id = 1; string name = 2; DecimalValue price = 3; } message DecimalValue { int64 units = 1; int32 nanos = 2; }
实现方案
要让Ignite正确序列化DecimalValue,需为其实现BinaryType特化模板,再在Product的序列化逻辑中复用该实现。
1. 为DecimalValue实现BinaryType特化
namespace ignite { namespace binary { template <> struct BinaryType<some_namespace::DecimalValue> : BinaryTypeDefaultAll<some_namespace::DecimalValue> { static void GetTypeName(std::string& dst) { dst = "DECIMAL_VALUE_TYPE"; } static void Write(BinaryWriter& writer, const some_namespace::DecimalValue& obj) { // 按字段写入DecimalValue的units和nanos writer.WriteInt64("units", obj.units()); writer.WriteInt32("nanos", obj.nanos()); } static void Read(BinaryReader& reader, some_namespace::DecimalValue& dst) { dst.set_units(reader.ReadInt64("units")); dst.set_nanos(reader.ReadInt32("nanos")); } }; }} // namespace ignite::binary
2. 完善Product的BinaryType模板
namespace ignite { namespace binary { template <> struct BinaryType<some_namespace::Product> : BinaryTypeDefaultAll<some_namespace::Product> { static void GetTypeName(std::string& dst) { dst = "PRODUCT_OMS_V1_TYPE"; } static void Write(BinaryWriter& writer, const some_namespace::Product& obj) { writer.WriteInt32("id", obj.id()); writer.WriteString("name", obj.name()); // 借助DecimalValue的BinaryType特化,直接写入对象 writer.WriteObject<some_namespace::DecimalValue>("price", obj.price()); } static void Read(BinaryReader& reader, some_namespace::Product& dst) { dst.set_id(reader.ReadInt32("id")); dst.set_name(reader.ReadString("name")); dst.mutable_price()->CopyFrom(reader.ReadObject<some_namespace::DecimalValue>("price")); } }; }} // namespace ignite::binary
关键注意点
- Ignite二进制序列化要求每个自定义类型必须对应
BinaryType特化模板,客户端才能识别并处理字段读写。 - 若要与Java端
BinaryWriter.writeDecimal兼容,需确保DecimalValue的字段与Java端Decimal的二进制存储结构对齐:Java端通常写入scale(int)和unscaled值(long),如果你的nanos对应scale,需调整字段名或写入顺序匹配Java端逻辑。
内容的提问来源于stack exchange,提问作者Zheng Wang
相关产品推荐
相关产品推荐

