热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

浅复制到协议缓冲区的字节字段中

如何解决《浅复制到协议缓冲区的字节字段中》经验,为你挑选了1个好方法。

假设我有一个带字节字段的proto:

message MyProto {
    optional bytes data = 1;
}

我无法控制的API为我提供了指向源数据及其大小的指针.我想在没有深度复制的情况下MyProto从这些数据中获取数据.我认为这很容易做到,但似乎不可能.深度复制很容易set_data.Protobuf提供了一个set_allocated_data函数,但它需要一个指向a的指针std::string,这对我没有帮助,因为(除非我弄错了)没有办法在std::string没有深度复制的情况下进行.

void populateProto(void* data, size_t size, MyProto* message) {
    // Deep copy is fine, I guess.
    message->set_data(data, size);

    // Shallow copy would be better...
    // message->set_allocated_data( ??? );
}

有没有办法正确填充这个原型(以便以后可以序列化)而无需将源数据深度复制到字节字段中?

我知道我可以立即手动进行序列化,但如果可能的话,我宁愿不这样做.



1> Alejandro C ..:

好问题。选项包括:

    如果您可以更改.proto文件,请考虑为实施即将到来的C ++ 17的Google的ctypefield选项。这就是Google在内部处理此类案件的方式。该消息已经具有StringPiece的语义,但是Google尚未开源该实现。StringPiecestring_viewFieldOptions

    message MyProto {
        bytes data = 1 [ctype = STRING_PIECE];
    }
    

    请参阅此讨论以获取实施指南。您可以忽略关于竞技场分配的注释,这不适用于您的情况。值得向Google索取ETA。

    使用不同的协议缓冲区实现,可能仅适用于此特定消息类型。protobuf-c和protobluff是看起来很有前途的C语言实现。

    向您的第三方API提供缓冲区。我从评论中看到您无法做到,但出于完整性考虑,我将其包括在内。

    ::str::string* buf = myProto->mutable_data();
    buf->resize(size);
    api(buf->data(), size); // data is contiguous per c++11 std
    

    非标准:通过覆盖字符串实例中的数据来破坏封装。C ++具有一些粗糙的功能,这些功能可以使您足够绞死自己。此选项不安全,取决于您的std::string实现和其他因素。

    // NEVER USE THIS IN PRODUCTION
    void string_jam(::std::string * target, void * buffer, size_t len) {
      /* On my system, std::string layout
       *   0: size_t capacity
       *   8: size_t size
       *  16: char * data (iff strlen > 22 chars) */
      assert(target->size() > 22);
      size_t * size_ptr = (size_t*)target;
      size_ptr[0] = len; // Overwrite capacity
      size_ptr[1] = len; // Overwrite length
    
      char ** buf_ptr = (char**)(size_ptr + 2); 
      free(*buf_ptr); // Free the existing buffer
      *buf_ptr = (char*)buffer; // Jam in our new buffer
    }
    

    注意:这可能会让您被解雇。如果您确实执行了零复制路线,但未在产品中进行,则这对于进行测试以衡量性能影响很有用。

如果使用选项#1,则可以释放源代码就很好了,因为许多其他人将从此功能中受益。祝你好运。


推荐阅读
  • 1Authenticator简介1.1层次结构图1.2作用职责是验证用户帐号,是ShiroAPI中身份验证核心的入口点;接口中声明的authenticate方法就是用来实现认证逻辑 ... [详细]
  • 本文详细介绍了Java集合框架中的Collection体系,包括集合的基本概念及其与数组的区别。同时,深入探讨了Comparable和Comparator接口的区别,并分析了各种集合类的底层数据结构。最后,提供了如何根据需求选择合适的集合类的指导。 ... [详细]
  • 交互式左右滑动导航菜单设计
    本文介绍了一种使用HTML和JavaScript实现的左右可点击滑动导航菜单的方法,适用于需要展示多个链接或项目的网页布局。 ... [详细]
  • YB02 防水车载GPS追踪器
    YB02防水车载GPS追踪器由Yuebiz科技有限公司设计生产,适用于车辆防盗、车队管理和实时追踪等多种场合。 ... [详细]
  • MySQL锁机制详解
    本文深入探讨了MySQL中的锁机制,包括表级锁、行级锁以及元数据锁,通过实例详细解释了各种锁的工作原理及其应用场景。同时,文章还介绍了如何通过锁来优化数据库性能,避免常见的并发问题。 ... [详细]
  • 在Java应用程序开发过程中,FTP协议被广泛用于文件的上传和下载操作。本文通过Jakarta Commons Net库中的FTPClient类,详细介绍如何实现文件的上传和下载功能。 ... [详细]
  • 本文探讨了如何利用System.Diagnostics.Trace作为.NET库中的通用日志记录方法,同时考虑了其在性能关键代码中的影响。 ... [详细]
  • 本文探讨了Web开发与游戏开发之间的主要区别,旨在帮助开发者更好地理解两种开发领域的特性和需求。文章基于作者的实际经验和网络资料整理而成。 ... [详细]
  • 最近同事提了一个需求过来,他觉得项目对于第三方日志记录的太多了,只想记录一些业务相关的日志减少对于框架日志的显示。具体要求就是对于框架日志只显示warn等级以上的,而业务日志显示info等级以上 ... [详细]
  • Go语言开发中的常见陷阱与解决方案
    本文探讨了在使用Go语言开发过程中遇到的一些典型问题,包括Map遍历的不确定性、切片操作的潜在风险以及并发处理时的常见错误。通过具体案例分析,提供有效的解决策略。 ... [详细]
  • 本文介绍了在Android项目中实现时间轴效果的方法,通过自定义ListView的Item布局和适配器逻辑,实现了动态显示和隐藏时间标签的功能。文中详细描述了布局文件、适配器代码以及时间格式化工具类的具体实现。 ... [详细]
  • BFS深搜hashtable来判断是横线还是竖线但是为啥还是90分啊呜呜!找不到原因#define_CRT_SECURE_NO_WARNINGS1#include ... [详细]
  • 首先说一下,这是我在CSDN上的第一个文章,其实这个账号早在几年前就申请了,不过当时只是为了下载一个资源,而且也不怎么懂信息技术相关的领域,后来就再也没怎么动过,直到今天我才开始使用这个账号 ... [详细]
  • 作为一名跨专业考生,最近在备战研究生入学考试的计算机编程部分。虽然没有编程基础,但通过九度在线教育平台的机试教程逐步学习,进展顺利。直到遇到贪心算法相关的题目,特别是浙江大学2012年的一道机试题——《加油还是不加油》,才遇到了挑战。本文将分享我在解决这一问题过程中的思考与学习体会。 ... [详细]
  • Ubuntu GamePack:专为游戏爱好者打造的Linux发行版
    随着Linux系统在游戏领域的应用越来越广泛,许多Linux用户开始寻求在自己的系统上畅玩游戏的方法。UALinux,一家致力于推广GNU/Linux使用的乌克兰公司,推出了基于Ubuntu 16.04的Ubuntu GamePack,旨在为Linux用户提供一个游戏友好型的操作环境。 ... [详细]
author-avatar
焦作艾文斯
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有