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

C#(Protobuf 3.32.0.0)如何将Protobuf消息序列化到带偏移的预分配字节数组?

将Protobuf消息序列化到预分配字节数组的正确方法

不要依赖那个私有构造函数——私有成员属于库的内部实现细节,版本迭代时可能被修改或移除,直接使用会导致代码不稳定。下面是基于Protobuf C#官方公共API的可靠实现方式:

实现步骤

  1. 确认预分配数组空间足够:调用消息实例的CalculateSize()方法获取序列化所需字节长度,确保数组可用长度不小于该值。
  2. 创建基于预分配数组的MemoryStream并指定可写模式。
  3. 通过CodedOutputStream包装该流,调用消息的WriteTo()方法完成序列化。

代码示例

// 替换为你的Protobuf消息实例
YourProtobufMessage message = new YourProtobufMessage();
// 预分配的字节数组、起始偏移、可用长度
byte[] preAllocatedBuffer = new byte[1024];
int offset = 0;
int availableLength = preAllocatedBuffer.Length;

// 验证空间是否足够
int requiredSize = message.CalculateSize();
if (requiredSize > availableLength)
{
    throw new InvalidOperationException("预分配数组空间不足,无法完成序列化");
}

// 序列化到预分配数组
using (var stream = new MemoryStream(preAllocatedBuffer, offset, availableLength, true))
using (var codedOutput = new CodedOutputStream(stream))
{
    message.WriteTo(codedOutput);
    codedOutput.Flush();
}

// 此时preAllocatedBuffer中从offset开始的requiredSize字节即为序列化结果

这种方式完全依赖官方公开API,兼容性和稳定性都有保障,同时满足直接写入预分配数组的需求。

内容的提问来源于stack exchange,提问作者21k

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 12:12:08