C#(Protobuf 3.32.0.0)如何将Protobuf消息序列化到带偏移的预分配字节数组?
将Protobuf消息序列化到预分配字节数组的正确方法
不要依赖那个私有构造函数——私有成员属于库的内部实现细节,版本迭代时可能被修改或移除,直接使用会导致代码不稳定。下面是基于Protobuf C#官方公共API的可靠实现方式:
实现步骤
- 确认预分配数组空间足够:调用消息实例的
CalculateSize()方法获取序列化所需字节长度,确保数组可用长度不小于该值。 - 创建基于预分配数组的
MemoryStream并指定可写模式。 - 通过
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
相关产品推荐
相关产品推荐

