首页 > 后端开发 > C++ > 如何用 C 语言实现 Java Protocol Buffers 定界 I/O 功能?

如何用 C 语言实现 Java Protocol Buffers 定界 I/O 功能?

Barbara Streisand
发布: 2024-12-05 02:32:09
原创
1008 人浏览过

How to Achieve Java Protocol Buffers Delimited I/O Functionality in C  ?

Java Protocol Buffers 分隔 I/O 函数的 C 等效项

问题:
开发人员尝试读取和写入多个 Protocol Buffers 消息从 C 和 Java 中的文件中使用 Java 中可用的“定界”I/O 函数可能会遇到问题,但看起来并非如此可在 C 中访问。

解决方案:
从版本 3.3.0 开始,C 中的头文件 google/protobuf/util 中引入了用于读写分隔消息的等效函数/delimited_message_util.h。这些函数是:

  • writeDelimitedTo():将分隔消息写入 google::protobuf::io::ZeroCopyOutputStream。
  • readDelimitedFrom():从 google::protobuf::io::ZeroCopyOutputStream 读取分隔消息。 google::protobuf::io::ZeroCopyInputStream.

注意:
由 C 和 Java protobuf 库的原作者提供的替代实现提供了优化不存在于官方库实现中。如下所示,此实现可以防止输入 64MB 后出现潜在故障,同时仍对单个消息强制实施 64MB 限制:

bool writeDelimitedTo(
    const google::protobuf::MessageLite& message,
    google::protobuf::io::ZeroCopyOutputStream* rawOutput) {
  // We create a new coded stream for each message.  Don't worry, this is fast.
  google::protobuf::io::CodedOutputStream output(rawOutput);

  // Write the size.
  const int size = message.ByteSize();
  output.WriteVarint32(size);

  uint8_t* buffer = output.GetDirectBufferForNBytesAndAdvance(size);
  if (buffer != NULL) {
    // Optimization:  The message fits in one buffer, so use the faster
    // direct-to-array serialization path.
    message.SerializeWithCachedSizesToArray(buffer);
  } else {
    // Slightly-slower path when the message is multiple buffers.
    message.SerializeWithCachedSizes(&output);
    if (output.HadError()) return false;
  }

  return true;
}

bool readDelimitedFrom(
    google::protobuf::io::ZeroCopyInputStream* rawInput,
    google::protobuf::MessageLite* message) {
  // We create a new coded stream for each message.  Don't worry, this is fast,
  // and it makes sure the 64MB total size limit is imposed per-message rather
  // than on the whole stream.  (See the CodedInputStream interface for more
  // info on this limit.)
  google::protobuf::io::CodedInputStream input(rawInput);

  // Read the size.
  uint32_t size;
  if (!input.ReadVarint32(&size)) return false;

  // Tell the stream not to read beyond that size.
  google::protobuf::io::CodedInputStream::Limit limit =
      input.PushLimit(size);

  // Parse the message.
  if (!message->MergeFromCodedStream(&input)) return false;
  if (!input.ConsumedEntireMessage()) return false;

  // Release the limit.
  input.PopLimit(limit);

  return true;
}
登录后复制

以上是如何用 C 语言实现 Java Protocol Buffers 定界 I/O 功能?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板