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

在protobuf消息或嵌套消息中有多个字段是最好的吗?

如何解决《在protobuf消息或嵌套消息中有多个字段是最好的吗?》经验,为你挑选了1个好方法。

我试图在网上找到一些建议,但找不到任何相关的建议.

假设我正在创建一个包含很多字段(50+)的协议缓冲区消息.最好是将所有字段保持在同一级别还是将它们组织在子消息中?这种或那种方式对表演有什么影响吗?

例:

message myMessage{
 string field1 = 1;
 string field2 = 2;
 ....
 string fieldn = n;
}

VS

message myMessage{
 SubMessage1 groupedfieldsbasedonsomebusinesslogic1 = 1;
 SubMessage2 groupedfieldsbasedonsomebusinesslogic2 = 2;

 message SubMessage1{
  string field1 = 1;
  string field2 = 2;
  ... 
  string fieldx = x;
 } 

 message SubMessage2{
  string fieldxplus1 = x+1;
  ... 
  string fieldn = n;
 }
}

我在这里并没有考虑可读性,因为在反序列化以获得平坦数据或嵌套数据时存在利弊.我的问题是真正关注技术影响.



1> Marc Gravell..:

没有"最好的" - 一切都是上下文的,只有你拥有大部分的上下文.

然而!关于表现的一些小想法:

嵌套方法需要更多对象; 通常这很好,除非你的数量庞大

嵌套方法可以更容易理解对象模型以及数据的某些部分之间的关​​系

平坦的方法需要更大的场数; 字段编号1-15采用单字节头; 字段编号16-2047需要2个字节的标题(依此类推); 实际上,这几个字段的额外字节不太可能对您造成太大影响,并且会被替代(嵌套)方法的开销所抵消:

嵌套方法需要每个子对象的长度前缀,或者一个开始/结束标记(协议中的"组"); 这在额外的尺寸方面并不多,但是:

length-prefixe要求序列化器提前知道长度,这意味着要么进行双重处理("计算长度"扫描),要么进行缓冲; 在大多数情况下,这不是一个大问题,但对于非常大的子图可能会有问题

开始/结束令牌是谷歌一直试图杀死的东西,并没有在所有库中得到很好的支持(而且IIRC在"proto3"模式中不存在); 我仍然非常喜欢它,但在某些情况下:) protobuf-net(来自标签)支持将任意子数据编码为组的能力,但如果你以后需要x-plat它可能会很尴尬

在所有这些事情中,如果是我,我会关注的是第二个.

也许从看起来可用的东西开始,并测量它以获得真实的数据量; 它的表现是否可以接受?


推荐阅读
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • iOS超签签名服务器搭建及其优劣势
    本文介绍了搭建iOS超签签名服务器的原因和优势,包括不掉签、用户可以直接安装不需要信任、体验好等。同时也提到了超签的劣势,即一个证书只能安装100个,成本较高。文章还详细介绍了超签的实现原理,包括用户请求服务器安装mobileconfig文件、服务器调用苹果接口添加udid等步骤。最后,还提到了生成mobileconfig文件和导出AppleWorldwideDeveloperRelationsCertificationAuthority证书的方法。 ... [详细]
  • 纠正网上的错误:自定义一个类叫java.lang.System/String的方法
    本文纠正了网上关于自定义一个类叫java.lang.System/String的错误答案,并详细解释了为什么这种方法是错误的。作者指出,虽然双亲委托机制确实可以阻止自定义的System类被加载,但通过自定义一个特殊的类加载器,可以绕过双亲委托机制,达到自定义System类的目的。作者呼吁读者对网上的内容持怀疑态度,并带着问题来阅读文章。 ... [详细]
  • 解决.net项目中未注册“microsoft.ACE.oledb.12.0”提供程序的方法
    在开发.net项目中,通过microsoft.ACE.oledb读取excel文件信息时,报错“未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序”。本文提供了解决这个问题的方法,包括错误描述和代码示例。通过注册提供程序和修改连接字符串,可以成功读取excel文件信息。 ... [详细]
  • 本文介绍了在使用Laravel和sqlsrv连接到SQL Server 2016时,如何在插入查询中使用输出子句,并返回所需的值。同时讨论了使用CreatedOn字段返回最近创建的行的解决方法以及使用Eloquent模型创建后,值正确插入数据库但没有返回uniqueidentifier字段的问题。最后给出了一个示例代码。 ... [详细]
  • 本文介绍了解决java开源项目apache commons email简单使用报错的方法,包括使用正确的JAR包和正确的代码配置,以及相关参数的设置。详细介绍了如何使用apache commons email发送邮件。 ... [详细]
  • 精讲代理设计模式
    代理设计模式为其他对象提供一种代理以控制对这个对象的访问。代理模式实现原理代理模式主要包含三个角色,即抽象主题角色(Subject)、委托类角色(被代理角色ÿ ... [详细]
  • 我有一个RepeatedPtrField<M::Table>和一个protobuf消息,M为:messageM{me ... [详细]
  • protobuf 3教程
    本文主要分享【protobuf3教程】,技术文章【4、protobuf进阶】为【无休止符】投稿,如果你遇到Go微服务实战-电商系统相关问题,本文相关知识或能到你。protobuf3教程目 ... [详细]
  • 我正在尝试从官方的Google字体存储库中解析一个METADATA.pb文件,该文件可在以下位置找到: ... [详细]
  • 我是GoogleProtobuf的新手。我想解决一个问题,但我无法在互联网上找到答案, ... [详细]
  • egret protobufjs安装使用
    先安装好nodeprotobufjsgithub地址:https:github.comdcodeIOprotobuf.js#installation安装:npminstallprotobufjs-g安装全局protobufjsnpm ... [详细]
  • gRPC框架学习:2、ProtocolBuffers学习文章目录gRPC框架学习:2、ProtocolBuffers学习1.前言2.定义消息类型(1). ... [详细]
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社区 版权所有