You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 01:37:06