如何将值类型转换为Protobuffer的`Any`类型?
关于Protobuf Any类型直接承载值类型的解决方案
Protobuf的Any类型设计目标是承载实现IMessage接口的消息类型,而非直接的基础值类型,但你不需要自己手动定义包装消息——官方已经在google/protobuf/wrappers.proto中提供了一系列单字段消息类型,专门用来包装基础值类型,直接就能和Any配合使用:
- 字符串:
StringValue - 整数类型:
Int32Value、UInt32Value、Int64Value、UInt64Value - 浮点数:
FloatValue、DoubleValue - 布尔值:
BoolValue - 字节数组:
BytesValue
C#代码示例
打包基础值到Any:
using Google.Protobuf.WellKnownTypes; // 包装字符串 var stringAny = Any.Pack(new StringValue { Value = "测试字符串" }); // 包装整数 var intAny = Any.Pack(new Int32Value { Value = 123 }); // 包装布尔值 var boolAny = Any.Pack(new BoolValue { Value = true });
从Any解包还原值:
// 解包字符串 if (stringAny.Is(StringValue.Descriptor)) { var stringValue = stringAny.Unpack<StringValue>(); var originalStr = stringValue.Value; } // 解包整数 if (intAny.Is(Int32Value.Descriptor)) { var intValue = intAny.Unpack<Int32Value>(); var originalInt = intValue.Value; }
这些官方提供的*Value类型已经实现了IMessage接口,完全符合Any.Pack方法的参数要求,既不用自己编写.proto定义,也能实现用Any承载基础值类型的需求。
内容的提问来源于stack exchange,提问作者Arnold Zahrneinder
相关产品推荐
相关产品推荐

