roto

阅读 / 问答 / 标签

请问服装外贸中 proto sample 是什么样衣?

初板. 第一次打出来的样品. 也叫"头办"

protobuf报错command not found: protoc和Brew Link失败

因为安装其他东西动了环境导致protobuf的命令无法执行。报错 command not found: protoc 。没找到原因,想着就直接卸载重装了protobuf。 $ brew uninstall protobuf //然后重新安装 $ brew install protobuf 安装之后link失败了,报错如下 网上找了一圈,执行下就可以重新link了。 然后protobuf指令也正常了。 指令来源

go的protobuf这个问题是不是一个bug

客户端lua,通信协议是protobuf,以前用网易的proto-gen-lua,使用过程遇到些问题需要绕,比如: 1、每次更改、增加proto都要生成新的文件,代码规模剧增 2、由于lua本身,每个文件最大文件内全局local变量不能超过200个,所以当proto规模太大时。

ip-proto 253是什么

这个是思科的配置,本人不太熟悉...解释仅供参考... ip forward-protocol udp bootpsservice dhcp这个是开启DHCP服务... spanning-tree rmon enable这个是开启生成树协议... !forward protocol udp 67(active)!ip helper-address 125.219.152.18指定DHCP服务器的地址... 最后一条配置静态默认路由,即网关...

怎么把.proto格式文件转化成.cs C#脚本?

这个把后缀修改了,就可以,当然内容要调整

如何在Windows环境下的VS中安装使用Google Protobuf完成SOCKET通信

1.下载protobuff,我下的是2.3.0版本最新的protobuf可以到Google Code上下载:http://code.google.com/p/protobuf/downloads/list当前版本为2.3.0,下载两个压缩包:protoc-2.3.0-win32.zip和protobuf-2.3.0.zip,前者是protobuf的编译器,后者包含了有三程序语言的开发包。 2.解压首先解压protoc-2.3.0-win32.zip,把protoc.exe文件放到path路径中,最简单的做法就是把这个文件拷贝到C:/WINDOWS目录下。解压protobuf-2.3.0.zip文件,将文件加压到C盘根目录,主文件位于C:/protobuf-2.3.0/protobuf-2.3.0目录下。 3.安装操作(1)使用VS2005编译proto,VS工程目录位于vsprojects目录中,工程名字为“protobuf.sln”。 (2)选择“生成”à“生成解决方案”选项进行编译,编译过程中可能会由于编译的顺序报错误,可以使用手工逐个顺序编译生成,可能会比较顺利。按照下图的顺序,右键“重新生成”,逐个编译。但是我在实习操作过程中,libprotobuf-lite工程重来都没有成功编译通过过。淡定先,这个不会影响大局的。(3)编译完成会在目录vsprojects下的Debug目录中生成lib和exe文件。生成清单如下:exe文件:2010-04-15 09:51 950,272 lite-test.exe2010-04-15 09:50 3,219,456 protoc.exe2010-04-15 09:48 9,228,288 tests.exe2010-04-15 09:56 2,519,040 test_plugin.exe lib文件:2010-04-15 09:50 2,685,922 libprotobuf-lite.lib2010-04-15 09:56 24,100,794 libprotobuf.lib2010-04-15 09:56 17,302,068 libprotoc.lib其实我在测试过程中,lite-test.exe和libprotobuf-lite.lib并没有生成,因为编译错误了,但这并不影响大局,淡定先。 (4)OK,至此,我们已经完成了编译工作,下面需要进行的是protobuf的测试。我们需要使用到之前VS编译出来的libprotobuf.lib和libprotoc.lib完成一个C/S结构的SOCKET通信测试。 àProtobuf的测试在VS2005下,创建两个新的工程,分别命名为server和client,每个工程都需要引用protobuf的头文件和lib文件。一、添加protobuf头文件操作:右击项目à属性à配置属性àC/C++à常规 (也命令行可在中添加)。具体路径:C:/protobuf-2.3.0/protobuf-2.3.0/src二、添加protobuf的lib文件操作:右击项目à属性à配置属性à链接器à常规(也可在命令行中添加)。具体路径:C:/protobuf-2.3.0/protobuf-2.3.0/vsprojects/Debug三、CMD窗口下编译生成头文件:C:/protobuf-2.3.0/protobuf-2.3.0/examples>protoc -I=./ --cpp_out=./ people.proto将proto文件生成的文件放到当前目录。

解决protobuf忽略空返回值的问题

最近在用Kratos开发项目的时候遇到了问题,repeated类型的字段在值为空的情况下,字段被直接忽略掉了。 我希望的是即使为空的情况下也能返回一个空数组,而不是直接把整个字段忽略掉,就像下面这样: 经过多方排查之后找到了问题所在,google会在生成pb.go文件时在json标签里插入 omitempty 属性,而json库在转换json时一旦遇到这个标签就会忽略掉空字段,这不符合我的需求,所以把这个字段去掉就好了。 先写一个shell脚本来递归遍历api目录下的pb.go文件: 接着修改Makefile文件: 在api的最下面添加替换脚本,流程就是遍历scandir脚本查出来的pb.go文件,替换掉文件里所有的omitempty,然后将文件暂存为.tmp,最后再覆盖原文件。 今后每次执行make api时就会连带自动替换掉所有生成文件中的omitempty,免得每次手动替换麻烦又容易出错。 参考: https://ld246.com/article/1591110788411

模具中PR:PROTO, OT:OFF TOOL, OP:OFF TOOL & OFF PROCESS 上面PR,OT,OP 是什么意思啊!

PR prototype 的缩写吧 未开模产品样件OT 可能指的是 OTS off tooling samples 全状态工装非生产节拍下的样件请说的在具体一点

怎么把.proto格式文件转化成.cs C#脚本?

这个把后缀修改了,就可以

SMT表面贴机中的prototpye调较一般包括哪些参数?

元件品号,位号,坐标,方向,封装尺寸,feeder型号,吸嘴型号,真空压力大小。

protobuf 生成的变量会不会自动销毁

要看具体变量的类型,看个例子吧:在网络游戏中,游戏玩家之间的同步是一个最基本的功能,而同步是通过对坐标的广播进行的,因此我们假设一个简单的模型,当一个玩家的位置发生变化时,将玩家的新位置发给地图内所有玩家,根据这个情况写出以下proto文件。message PlayerPos{ required uint32 playerID = 1; required float posX = 2 ; required float posY = 3 ;}这样就有一个问题,现在的游戏都是3D游戏,因此需要xyz来表示位置,还需要另一组xyz来表示朝向,如果用简单变量的话就会显的很乱,而且无论是位置还是朝向其实都是一组xyz,因此可以将xyz抽出来成为一个复合数据类型,单独放在一个文件中。这样就构成以下文件。file vector.protomessage vector3D{required float x = 1;required float y = 2;required float z = 3;};file Player.protoimport "vector.proto";message PlayerPos {required uint32 playerID = 1;required vector3D pos = 2;};编译的时候先编译vector文件,采用import时需要注意路径,本例中两文件在同一目录下。protoc --cpp_out=. vector.proto Player.protoproto对应的文件已经生成了,但是该怎么赋值呢,查API查了半天有点不知所以,干脆来看生成的类文件的源代码吧 // required uint32 playerID = 1; inline bool has_playerid() const; inline void clear_playerid(); static const int kPlayerIDFieldNumber = 1; inline ::google::protobuf::uint32 playerid() const; inline void set_playerid(::google::protobuf::uint32 value); // required .vector3D pos = 2; inline bool has_pos() const; inline void clear_pos(); static const int kPosFieldNumber = 2; inline const ::vector3D& pos() const; inline ::vector3D* mutable_pos(); inline ::vector3D* release_pos(); inline void set_allocated_pos(::vector3D* pos);上面列出了生成的部分源代码,主要是PlayerPos的操作变量的函数,第一个playID很简单,可以看到直接使用set_playerid ( ) 即可,但是对于嵌套的pos 发现没有对应的set_pos方法,不过发现了一个set_allocated_pos() 函数,这个函数也是set开头的,看看这个函数是干嘛的。 inline void PlayerPos::set_allocated_pos(::vector3D* pos) { delete pos_; pos_ = pos; if (pos) { set_has_pos(); } else { clear_has_pos(); }}看上去可以赋值,直接调用set_allocated_pos() 进行赋值看一看PlayerPos player;vector3D tmp;tmp.x = 1;tmp.y = 2;tmp.z = 3;player.set_allocated_pos(&tmp)编译没问题,但是运行时出现错误,而且是很奇怪的错误,仔细了查看一下PlayerPos的源码,发现一个问题::vector3D* pos_; ::google::protobuf::uint32 playerid_;上面是PlayerPos中变量的保存形式,发现pos是作为一个指针存储的,如果按照之前的赋值 tmp 是一个局部变量,函数返回时局部变量自动销毁,而pos_保存的仍然是已被销毁的tmp的位置,因此会出错,如果采用new的话就可以解决这个问题,即赋值方法如下PlayerPos player;vector3D *tmp = new Vector3D;tmp->x = 1;tmp->y = 2;tmp->z = 3;player.set_allocated_pos(tmp)这样即可,编译运行都没有问题。如此之外,还有一种赋值方法,就是调用mutable_pos()inline ::vector3D* PlayerPos::mutable_pos() { set_has_pos(); if (pos_ == NULL) pos_ = new ::vector3D; return pos_;}mutable_pos () 中自己new出了一个vector3D 对象,而vector3D中又实现了赋值的重载,因此可以这样解决PlayerPos player;vector3D *tmp = player.mutable_pos();tmp->x = 1;tmp->y = 2;tmp->z = 3;

解释一下 从proto-oncogene转变到 oncogene的三种方式

转座:类似于插入突变,就是说转座子的插入使得原来的基因编码发生了突变基因放大:这个可能类似于基因突变中的重复点突变:这个不用详细解释,你懂得,点突变诱发蛋白质变异,导致细胞状态的转变。希望能帮到你。

为什么Protobuf的默认序列化格式没有包含消息的长度与类型

Protobuf 是经过深思熟虑的消息打包方案,它的默认序列化格式没有包含消息的长度与类型,自然有其道理。哪些情况下不需要在 protobuf 序列化得到的字节流中包含消息的长度和(或)类型?我能想到的答案有:如果把消息写入文件,一个文件存一个消息,那么序列化结果中不需要包含长度和类型,因为从文件名和文件长度中可以得知消息的类型与长度。如果把消息写入文件,一个文件存多个消息,那么序列化结果中不需要包含类型,因为文件名就代表了消息的类型。如果把消息存入数据库(或者 NoSQL),以 VARBINARY 字段保存,那么序列化结果中不需要包含长度和类型,因为从字段名和字段长度中可以得知消息的类型与长度。如果把消息以 UDP 方式发生给对方,而且对方一个 UDP port 只接收一种消息类型,那么序列化结果中不需要包含长度和类型,因为从 port 和 UDP packet 长度中可以得知消息的类型与长度。如果把消息以 TCP 短连接方式发给对方,而且对方一个 TCP port 只接收一种消息类型,那么序列化结果中不需要包含长度和类型,因为从 port 和 TCP 字节流长度中可以得知消息的类型与长度。如果把消息以 TCP 长连接方式发给对方,但是对方一个 TCP port 只接收一种消息类型,那么序列化结果中不需要包含类型,因为 port 代表了消息的类型。如果采用 RPC 方式通信,那么只需要告诉对方 method name,对方自然能推断出 Request 和 Response 的消息类型,这些可以由 protoc 生成的 RPC stubs 自动搞定。对于最后一点,比方说 sudoku.proto 定义为:service SudokuService {rpc Solve (SudokuRequest) returns (SudokuResponse);}那么 RPC method Sudoku.Solve 对应的请求和响应分别是 SudokuRequest 和 SudokuResponse。在发送 RPC 请求的时候,不需要包含 SudokuRequest 的类型,只需要发送 method name Sudoku.Solve,对方自知道应该按照 SudokuRequest 来解析(parse)请求。这个例子来自我的半成品项目 evproto。对于上述这些情况,如果 protobuf 无条件地把长度和类型放到序列化的字节串中,只会浪费网络带宽和存储。可见 protobuf 默认不发送长度和类型是正确的决定。Protobuf 为消息格式的设计树立了典范,哪些该自己搞定,哪些留给外部系统去解决,这些都考虑得很清楚。只有在使用 TCP 长连接,且在一个连接上传递不止一种消息的情况下(比方同时发 Heartbeat 和 Request/Response),才需要我前文提到的那种打包方案。(为什么要在一个连接上同时发 Heartbeat 和业务消息?请见陈硕《分布式系统的工程化开发方法》 p.51 心跳协议的设计。)这时候我们需要一个分发器 dispatcher,把不同类型的消息分给各个消息处理函数,这正是本文的主题之一。

Protobuf语法介绍

我们先看看官方文档给出的定义和描述 简单来讲, ProtoBuf 是结构数据序列化方法,可简单类比于,其具有以下特点: 在protobuf中,协议是由一系列的消息组成的。因此最重要的就是定义通信时使用到的消息格式。一个Protobuf 消息(对应JAVA类),由至少一个字段(对应Java类属性)组合而成。 消息的定义很简单,就是message关键字加上消息的名字 字段定义格式: 限定修饰符 | 数据类型 | 字段名称 | = | 字段编码 required: 表示是一个必须字段,必须相对于发送方,在发送消息之前必须设置该字段的值,对于接收方,必须能够识别该字段的意思。发送之前没有设置required字段或者无法识别required字段都会引发编解码异常,导致消息被丢弃。 optional: 表示是一个可选字段,可选对于发送方,在发送消息时,可以有选择性的设置或者不设置该字段的值。对于接收方,如果能够识别可选字段就进行相应的处理,如果无法识别,则忽略该字段,消息中的其它字段正常处理。---因为optional字段的特性,很多接口在升级版本中都把后来添加的字段都统一的设置为optional字段,这样老的版本无需升级程序也可以正常的与新的软件进行通信,只不过新的字段无法识别而已,因为并不是每个节点都需要新的功能,因此可以做到按需升级和平滑过渡。 repeated: 表示该字段可以包含0~N个元素。其特性和optional一样,但是每一次可以包含多个值。可以看作是在传递一个数组的值。类比于Java这边的List protobuf定义了一套基本的数据类型,几乎都映射了Java语言的基础数据类型(主要以Java为例) 详见下面表格 字段的命名方式与Java的命名方式大致一致 字段编码是一个序列化和反序列化的标记值,有了该值,通信双方才能互相识别对方的字段。当然相同的编码值,其限定修饰符和数据类型必须相同。编码值的取值范围为 1~2^32(4294967296) 其中 1~15的编码时间和空间效率都是最高的,编码值越大,其编码的时间和空间效率就越低(相对于1-15),当然一般情况下相邻的2个值编码效率的是相同的,除非2个值恰好实在4字节,12字节,20字节等的临界区。比如15和16 1900~2000编码值为Google protobuf 系统内部保留值,建议不要在自己的项目中使用。protobuf 还建议把经常要传递的值把其字段编码设置为1-15之间的值 完整的消息定义示例 枚举的定义和Java 相同,使用 enum 关键字,但是有一些限制。 枚举值必须大于等于0的整数。 使用分号 ; 分隔枚举变量而不是Java 语言中的逗号 , 示例: 你可以将其他消息类型用作字段类型。已我们现在IM的为例,在每一个CSSendLiveRoomMsgReq消息中包含ImMsgBody消息,此时可以在相同的.proto文件中定义一个ImMsgBody消息类型,然后在CSSendLiveRoomMsgReq消息中指定一个ImMsgBody类型的字段 示例: 如果你的消息中有很多可选字段, 并且同时至多一个字段会被设置, 你可以加强这个行为,使用oneof特性节省内存,Oneof字段就像可选字段, 除了它们会共享内存, 至多一个字段会被设置。 设置其中一个字段会清除其它字段。 为了在.proto定义Oneof字段, 你需要在名字前面加上oneof关键字, 比如下面例子的ImMsgBody: oneof的特性

服装外贸中 proto sample 是什么样衣

16、惠崇《春江晓景》 苏轼

protocol buffer的service接口生成问题

什么是protocol bufferProtocolBuffer是用于结构化数据串行化的灵活、高效、自动的方法,有如XML,不过它更小、更快、也更简单。你可以定义自己的数据结构,然后使用代码生成器生成的代码来读写这个数据结构。你甚至可以在无需重新部署程序的情况下更新数据结构。1.2 他们如何工作你首先需要在一个 .proto 文件中定义你需要做串行化的数据结构信息。每个ProtocolBuffer信息是一小段逻辑记录,包含一系列的键值对。这里有个非常简单的 .proto 文件定义了个人信息:message Person { required string name=1; required int32 id=2; optional string email=3; enum PhoneType { MOBILE=0; HOME=1; WORK=2; } message PhoneNumber { required string number=1; optional PhoneType type=2 [default=HOME]; } repeated PhoneNumber phone=4;}有如你所见,消息格式很简单,每个消息类型拥有一个或多个特定的数字字段,每个字段拥有一个名字和一个值类型。值类型可以是数字(整数或浮点)、布尔型、字符串、原始字节或者其他ProtocolBuffer类型,还允许数据结构的分级。你可以指定可选字段,必选字段和重复字段。你可以在( gle.com/apis/protocolbuffers/docs/proto.html )找到更多关于如何编写 .proto 文件的信息。一旦你定义了自己的报文格式(message),你就可以运行ProtocolBuffer编译器,将你的 .proto 文件编译成特定语言的类。这些类提供了简单的方法访问每个字段(像是 query() 和 set_query() ),像是访问类的方法一样将结构串行化或反串行化。例如你可以选择C++语言,运行编译如上的协议文件生成类叫做 Person 。随后你就可以在应用中使用这个类来串行化的读取报文信息。你可以这么写代码:Person person;person.set_name("John Doe");person.set_id(1234);person.set_email("jdoe@example.com");fstream.output("myfile",ios::out | ios::binary);person.SerializeToOstream(&output);然后,你可以读取报文中的数据:fstream input("myfile",ios::in | ios:binary);Person person;person.ParseFromIstream(&input);cout << "Name: " << person.name() << endl;cout << "E-mail: " << person.email() << endl;你可以在不影响向后兼容的情况下随意给数据结构增加字段,旧有的数据会忽略新的字段。所以如果使用ProtocolBuffer作为通信协议,你可以无须担心破坏现有代码的情况下扩展协议。你可以在API参考( oogle.com/apis/protocolbuffers/docs/reference/overview.html )中找到完整的参考,而关于ProtocolBuffer的报文格式编码则可以在( .google.com/apis/protocolbuffers/docs/encoding.html )中找到。1.3 为什么不用XML?ProtocolBuffer拥有多项比XML更高级的串行化结构数据的特性,ProtocolBuffer:更简单小3-10倍快20-100倍更少的歧义可以方便的生成数据存取类例如,让我们看看如何在XML中建模Person的name和email字段:<person> <name>John Doe</name> <email>jdoe@example.com</email></person>对应的ProtocolBuffer报文则如下:#ProtocolBuffer的文本表示#这不是正常时使用的二进制数据person { name: "John Doe" email: "jdoe@example.com"}当这个报文编码到ProtocolBuffer的二进制格式( .google.com/apis/protocolbuffers/docs/encoding.html )时(上面的文本仅用于调试和编辑),它只需要28字节和100-200ns的解析时间。而XML的版本需要69字节(除去空白)和 5000-10000ns的解析时间。当然,操作ProtocolBuffer也很简单:cout << "Name: " << person.name() << endl;cout << "E-mail: " << person.email() << endl;而XML的你需要:cout << "Name: " << person.getElementsByTagName("name")->item(0)->innerText() << endl;cout << "E-mail: " << person.getElementsByTagName("email")->item(0)->innerText() << end;当然,ProtocolBuffer并不是在任何时候都比XML更合适,例如ProtocolBuffer无法对一个基于标记文本的文档建模,因为你根本没法方便的在文本中插入结构。另外,XML是便于人类阅读和编辑的,而ProtocolBuffer则不是。还有XML是自解释的,而 ProtocolBuffer仅在你拥有报文格式定义的 .proto 文件时才有意义。1.4 听起来像是为我的解决方案,如何开始?下 er编译器,用于生成你需要的IO类。构建和安装你的编译器,跟随README的指令就可以做到。一旦你安装好了,就可以跟着编程指导( ogle.com/apis/protocolbuffers/docs/tutorials.html )来选择语言-随后就是使用ProtocolBuffer创建一个简单的应用了。1.5 一点历史ProtocolBuffer最初是在Google开发的,用以解决索引服务器的请求、响应协议。在使用ProtocolBuffer之前,有一种格式用以处理请求和响应数据的编码和解码,并且支持多种版本的协议。而这最终导致了丑陋的代码,有如:if (version==3) { ...}else if (version>4) { if (version==5) { ... } ...}通信协议因此变得越来越复杂,因为开发者必须确保,发出请求的人和接受请求的人必须同时兼容,并且在一方开始使用新协议时,另外一方也要可以接受。ProtocolBuffer设计用于解决这一类问题:很方便引入新字段,而中间服务器可以忽略这些字段,直接传递过去而无需理解所有的字段。格式可以自描述,并且可以在多种语言中使用(C++、Java等)然而用户仍然需要手写解析代码。随着系统的演化,他需要一些其他的功能:自动生成编码和解码代码,而无需自己编写解析器。除了用于简短的RPC(Remote Procedure Call)请求,人们使用ProtocolBuffer来做数据存储格式(例如BitTable)。RPC服务器接口可以作为 .proto 文件来描述,而通过ProtocolBuffer的编译器生成存根(stub)类供用户实现服务器接口。ProtocolBuffer现在已经是Google的混合语言数据标准了,现在已经正在使用的有超过48,162种报文格式定义和超过 12,183个 .proto 文件。他们用于RPC系统和持续数据存储系统。2 语言指导本指导描述了如何使用ProtocolBuffer语言来定义结构化数据类型,包括 .proto 文件的语法和如何生成存取类。这是一份指导手册,一步步的例子使用文档中的多种功能,查看入门指导( m/apis/protocolbuffers/docs/tutorials.html )选择你的语言。2.1 定义一个消息类型@waiting …2.2 值类型@waiting …2.3 可选字段与缺省值@waiting …2.4 枚举@waiting …2.5 使用其他消息类型@waiting …2.6 嵌套类型@waiting …2.7 更新一个数据类型@waiting …2.8 扩展@waiting …2.9 包@waiting …2.10 定义服务@waiting …2.11 选项@waiting …2.12 生成你的类@waiting …3 代码风格指导本文档提供了 .proto 文件的代码风格指导。按照惯例,你将会,你将会生成一些便于阅读和一致的ProtocolBuffer定义文件。3.1 消息与字段名使用骆驼风格的大小写命名,即单词首字母大写,来做消息名。使用GNU的全部小写,使用下划线分隔的方式定义字段名:message SongServerRequest { required string song_name=1;}使用这种命名方式得到的名字如下:C++: const string& song_name() {...} void set_song_name(const string& x) {...}Java: public String getSongName() {...} public Builder setSongName(String v) {...}3.2 枚举使用骆驼风格做枚举名,而用全部大写做值的名字:enum Foo { FIRST_VALUE=1; SECOND_VALUE=2;}每个枚举值最后以分号结尾,而不是逗号。3.3 服务如果你的 .proto 文件定义了RPC服务,你可以使用骆驼风格:service FooService { rpc GetSomething(FooRequest) returns (FooResponse);}4 编码本文档描述了ProtocolBuffer的串行化二进制数据格式定义。你如果仅仅是在应用中使用ProtocolBuffer,并不需要知道这些,但是这些会对你定义高效的格式有所帮助。4.1 一个简单的消息@waiting …4.2 基于128的Varints@waiting …4.3 消息结构@waiting …4.4 更多的值类型@waiting …4.5 内嵌消息@waiting …4.6 可选的和重复的元素@waiting …4.7 字段顺序@waiting …5 ProtocolBuffer基础:C++@waiting …6 ProtocolBuffer基础:Java@waiting …7

golang gRPC xorm 优雅的解决proto没有int类型?

type Info struct{Age int32 `xorm:" INT(8)"`}字段超多可以从数据库用xorm reverse出来结构,或者直接querystring 得到map[string]string,想怎么处理都行。另外,没太明白你要问什么。

了解一下ProtoBuf

我们在进行网络通信调用的时候,总是需要将内存的数据块经过序列化,转换成为一种可以通过网络流进行传输的格式。而这种格式在经过了传输之后再经过序列化,能还原成我们预想中的数据结构。 那么我们对于这种用于中间网络传输的数据格式就有一定的要求。首先它可以准确地描述数据内容,在此基础上我们则希望它尽量的小。 最开始流行起来的是XML,可扩展标记语言。由于它可以用来标记数据、定义数据类型,所以用户可以自己定义数据自己的语言,从而让对不同的数据结构化成统一的格式称为了可能。 而另外一个我们熟知的则是JSON(JavaScript Object Notation, JS 对象简谱)。尽管JSON中缺少了XML中的标签属性等描述方式,但是足够简介和清晰的层次结构使得其成为了必XML更受欢迎的数据交换格式。 同一份数据显然JSON的数据量比XML所使用的空间更少。那么空间省略在哪里呢?一方面是json使用更简单的字符来定义数据间的关联关系;另一方面是JSON减少了对数据类型的描述。但是丢少的数据类型再哪里呢? 以Java中的 OpenFeign 举例,JSON中缺少的类型定义被定义道程序中的接口中了。当进行序列化与反序列化时,JSON格式并不记录数据的类型,具体的数据类型在序列化方与反序列化方通过事先约定的接口来进行定义。这样就减少了信息传输过程中的信息量,从而让数据得以压缩。 但是JSON由于没有定义数据类型,所以在传输的过程中实际上就都是文本流,那么这种方法还可以进一步压缩吗? 结合上文的讨论,我们先说结论:方法是有的,并写当前的实现方式是ProtoBuf。但在此之前我们先来了解一下ProtoBuf。 我们可以先看看官方给出的定义与描述: 同样的,ProtoBuf也是一种支持序列化反序列化的方法,并且他具有很多优点: 实际上,ProtoBuf提供了一种通用的数据描述方式,这种定义数据的方式是通用的,就如同JSON或者XML一样。 接下来我们来来回答本节一开始的问题,针对JSON来说,ProtoBuf是如何将体积变得更小的呢?答案很简单,就是为数据序列化反序列化提供更多的先验知识。 本文暂不过度深入ProtoBuf原理,但是可以通过一张图来进行简要说明(): ProtoBuf中的数据是按顺序进行排列,而整体的结构为若干个field,每一个field中由 Tag-[Length]-Value 组成。Length是可选的,而是否存在Length是通过Tag的类型来决定的。也就是说如果是指定的类型,比如int64,那我们就可以知道Value的长度,也就不用在依靠Length来对其空间进行描述(redis中的压缩列表也是这个思想)。 那么field应该对应的是什么字段呢?这个则是在序列化与反序列化时在ProtoBuf的服务端与客户端之间进行预先定义的。而因为提前定义了field的类型、排序,所以field本身可以不用对字段名、字段位置进行描述,只需要根据字段类型选用合适的二进制序列化方法,将字段本身的value值进行序列化传输即可。 稍微总结一下: ProtoBuf通过对传输字段的名称、顺序进行预定义,从而在传输结构中只需要顺序的记录每个字段的类型标签和二进制值。 尽管上文和官方中都是以XML或者JSON来对ProtoBuf进行对比。但是因为ProtoBuf本身就是二进制序列化方式,所以从压缩比上比较感觉有点欺负人。 对应的在Java中二进制常用的序列化器有Kryo和Hessian。但事实上,由于Kryo和Hessian中都需要对Java类名和字段信息进行存储。而ProtoBuf则只有Tag-Length-Value的数据对,且Value更是有针对性的特殊编码,所以空间占用小的很多。 Kryo是专门针对Java进行优化了的。所以在使用的便捷性上来说Kryo则更加方便。但ProtoBuf是跨平台的,且由于进行了字段的顺序定义,所以似的ProtoBuf定义后的接口是可以向前兼容的(只向后追加字段),而这种优势是Kryo所没有的。 ProtoBuf是跨语言的,使用ProtoBuf的第一步是先定一个 proto 文件 ,而由于ProtoBuf 2和3语言版本的不同,其定义格式会有所不同,具体的细节还是得参考官方文档:https://developers.google.cn/protocol-buffers/docs/proto3 对于ProtoBuf 3 的定义文档我们可以按如下方法定义: 其中message关键字是定义的文件名,而 string、int32则是预定的字段类型,repeated则是描述字段为可重复任意多次的字段。 ProtoBuf通过这种形式的文件定义了传输信息的文件结构。 但是之前小节中我们知道了ProtoBuf是通过 Tag-[Length]-Value 组成的数据组来进行信息传输的,那么proto文件中定义的内容如何转换为实际传输的对象呢? ProtoBuf的做法是,为每一种语言提供一个生成器protoc。通过使用protoc则可以根据.proto文件生成为一组java文件。对应的官方语法演示样例为: 官方的生成参考为:https://developers.google.com/protocol-buffers/docs/reference/java-generated 生成后的java文件将提供对应的实体以及数据的构造方法等文件,从而支持后续的使用。 需要注意的是,ProtoBuf是本质上是序列化方法,具体是通过Spring Cloud 的OpenFeign进行接口调用,还是通过grpc进行接口调用,都是可以的。 本文对ProtoBuff进行了概念的整理,并没有对每个细节都进行深入的梳理,可以当作概念科普来进行阅读。

protobuffer 怎么输出

在网上查了一下,虽然有很多文章介绍Protocol Buffer,但是实际使用起来,还是会遇到很多问题,所以我想应该有一个指南一样的东西,让新手很快就能使用它。Protocol Buffer简写为Protobuf,是Google开发的一种储存数据的方式,功能与XML一样,但更方便,数据量更小,速度更快,在序列化和反序列化的时候使用,有很大的优势。比如,网络游戏的通讯协议编写。更重要的是,它是一个开源项目。由于Protobuf不能生成C#代码,所以就要用到另外一个开源项目protobuf-net,用法是,在命令行用protoc.exe依据你自己定义的.proto文件,来生成.cpp文件用protobuf-net的protogen.exe来生成.cs文件,可以写一个批处理,如下:protoc -I=. --cpp_out=. Net.proto //在当前目录下,以cpp方式编译Net.protoprotogen -i:Net.proto -o:Net.cs //在当前目录下,用Net.proto生成Net.cs其实两句功能是一样,只是分别生成了Net.proto的cpp文件和cs文件,这样就可以在两种语言编写的应用程序间通信了。

ProtocolBuffer浅析

ProtocolBuffer是google 定义的一种数据交换的格式,它独立于语言,独立于平台。google 提供了多种语言的实现:java、c#、c++、go 和 python,每一种实现都包含了相应语言的编译器以及库文件。ProtocolBuffer类似于xml、json,不过它更小、更快、也更简单。 目前使用最广泛的数据传输协议为JSON,JSON是一种轻量级的数据交换格式而且层次和结构比较简单和清晰,这里主要对比一下Protocol Buffer和JSON的对比,给出优势和劣势: 优势 劣势 实际数据对比 Protocol Buffer的使用流程总体可以分为三步,如下图所示: google推荐在Android项目中使用lite版,lite版本生成的java文件更加轻量,其配置如下: 首先创建一个.proto文件,并且在文件中声明如下内容: 在整个proto文件中数据类型分为基本类型和结构类型,其中结构类型主要为: 下面分别介绍一下不同结构的作用及规定: message表示一个结构,类似于java中类,一个proto文件中可以声明多个message结构: message可以引用不同proto文件中的message,只要在proto文件中的最上面声明import即可,如下所示: enum使用很简单,直接在message中声明enum结构体并且将属性声明为对应的enum即可: 在proto3中,enum第一个值必须为0,主要是为了和基础类型的默认值保持一致 map是proto3新加的,使用也很简单: 如下 repeated修饰的属性类似于jsonArray,也类似于java中的List,该修饰符在格式正确的消息中可以重复任意次(包括0次) 日常开发过程中,由于需求的变更,往往需要增加字段,这就涉及到字段的扩充,字段扩充需要达到一个目的: 兼容 所以Protocol Buffer在字段扩充中定义了如下规则: 只要记住上述规则,就能完成字段扩充且老版本也能兼容 Protocol Buffer 更快更小的主要原因如下: 上面这个例子中,在序列化时,"name" 、"count"的key值不会参与,由编号1、2代替,这样在反序列化的时候直接通过编号找到对应的key就可以。需要注意的是编号一旦确定就不可以更改,服务端和客户端通过proto通信的时候需要提前定义号数据格式。 其中Length不一定有,依据Tag确定,例如int类型的数据就只有Tag-Value,string类型的数据就必须是Tag-Length-Value。 Protocol Buffer定义了如下的数据类型,其中部分数据类型已经不再使用: 上面已经介绍了Protocol Buffer的数据结构及Tag的类型,但是Tag块并不是只表示数据类型,其中数据编号也在Tag块中,Tag的生成规则如下: 其中Tag块的后3位表示数据类型,其他位表示数据编号 Java中整数类型的长度都是确定的,如int类型的长度为4个字节,可表示的整数范围为-2 31——2 31-1,但是实际开发中用到的数字均比较小,会造成字节浪费,可变长度编码就能很好的解决这个问题,可变长度编码规则如下: 举个例子: 其中第一个字节由于最高位为1,则后面的字节也是前面的数据的一部分,第二个字节最高位为0,则表示数据计算终止,由于Protocol Buffer是低位在前,整体的转换过程如下: 10000001 00000011 ——> 00000110000001 表示的10进制数为:2^0 + 2^7 + 2^8 = 385 通过上面的例子可以知道一个字节表示的数的范围0-128,上面介绍的Tag生成算法中由于后3位表示数据类型,所以Tag中1-15编号只占用1个字节,所以确保编号中1-15为常用的,减少数据大小。 可变长度编码唯一的缺点就是当数很大的时候int32需要占用5个字节,但是从统计学角度来说,一般不会有这么大的数. 上面介绍了Protocol Buffer的原理,现在通过实例来展示分析过程,我们定义的proto文件如下: 其序列化后的字节数据如下: 前面介绍过Protocol Buffer的 数据结构为TLV,其中L不是必须的,根据T的类型来确定 先看下第一个字节: 这里字节最高位为0,所以该Tag就用这一个字节表示,其中后3位表示类型,前面表示字段编号,所以: 这里字节最高位为0,所以该Tag就用这一个字节表示,其中后3位表示类型,前面表示字段编号,所以: file_num = 0001 = 1 type = 010 = 2 上面介绍过type=2,则后面有Length,按照可变长度编码规则,知道表示长度的字节为: 所以Length=4,则value的长度是4个字节,直接取出后面4个字节: 这4个字节对应的就是test 再看下一组: 由上面的Tag知道: file_num=2 type=0 前面介绍过type=0,后面没有Length,直接就是value, value=1,通过上面的解析可以知道 上面介绍了Protocol Buffer的原理,解释了为什么Protocol Buffer更快,更小,这里再总结一下: 参考资料: proto3官网指南: https://developers.google.com/protocol-buffers/docs/proto3 protobuf-gradle-plugin: https://github.com/google/protobuf-gradle-plugin 博客: https://juejin.im/post/5dcbf630e51d451bfe5bb21b

python grpc如何给proto文件中map类型的变量赋值?

改完之后,你可以选择project->clean,clean后你项目的R.java文件就会重新生成,所有的资源ID会重新分配,这样子你所修改的资源才能被Android真正识别,有时这个操作不是必要的,但是如果出现你修改了资源后,你的项目中出现了一些问题,那么执行Clean是一个必须的选择,这些资源包括drawable下的图片,布局里id的修改,values下资源的修改,你可以着手试一下 Good luck

原始汉语(Proto-Chinese)从原始汉藏语分出以后,由SOV到SVO的语序变化是怎么出现的?

殷商的更SVO,而周人的更SOV。殷商的语序来源,暂时不太清楚。而周人因为更加靠近藏语、一些羌族人的语言,所以在几百年的语言接触中,语法受到影响。一般,两种语言接触融合,会保留强势语言的词汇,而保留弱势语言的语法。这种语序作为语法的一部分被周人所接受。后来周人又重新入住中原,推翻了殷商人,将他们的语言,确切的说,是姬姓王室,带回了中原。但是,随后他们又雅言化了,又变成以SVO为主,这需要一定是历时材料的梳理。这一点,先秦文献,可以看出一点端倪。比如,诗经中不同的国家的用词有所不同。安大简出土的诗经中,只有姬姓诸侯国,会采用"言",作为第一人称代词。(当然,也有人认为安大简是伪造的。所以材料还是存疑)如果能够继续在各种文献中找到一批这样的现象,上古汉语的两层基本可以坐实。在这个框架下,可以进一步弄清楚题主的问题。

Protobuf 数据格式

简单来说, Protocol Buffers 是一种和语言平台都没关的数据交换格式。 关于 Protobuf 在iOS下的使用请看上篇文章 iOS 的 Protocol Buffer 简单使用 Protobuf 序列化后的二进制数据消息非常的紧凑,这得益于 Protobuf 所采用的 Varint Varint 是一种紧凑的表示数字的方法,它用一个或多个字节来表示一个数字,值越小的数字使用越少的字节数。这能减少用来表示数组的字节数。 比如对于 int32 类型的数字,一般需要4个 byte 来标识。但是采用 Varint,对于很小的 int32 类型的数字,也能用1个 byte 来标识。如果数字很大,也就需要5个 byte 来表示了。但是,一般情况下很少会出现数字都是大数的情况下。 正常情况下,每个 byte 的8个 bit 位都用于存储数据用,而在 Varint 中,每个 byte 的最高位的 bit 有着特殊的含义,如果该位为1,表示后续的 byte 也是该数据的一部分;如果该位为0,则结束。其他的7个 bit 位都用来表示数据。因此小于127的 int32 数字都可以用一个 byte 表示,而大于等于 128 的数字:如128,则会用两个字节表示: 1000 0000 0000 0001 (采用的是小端模式),311则表示: 1011 0111 0000 0010 下图演示了 Protobuf 如果通过2个 byte 解析出 128。Protobuf 字节序采用的是 little-endian(小端模式) int32 数据类型能表示负数,负数的最高位为1,如果负数也使用这种方式表示会出现一个问题,int32 总是需要5个字节,int64 总是需要10个字节。所以 Protobuf 定义了另外一种类型 sint32, sint64,采用 ZigZag 编码,所有的负数都使用正数表示,计算方式为: Protobuf 消息是一系列的键值对组成。消息的二进制版本仅使用 field 数字当作 key,不同 field 的属性和类型只能通过消息类型的定义 (即 .proto 文件) 在解码端确定。如果消息中不存在该 field,那么序列化后的 Message Buffer 中也不会有该 field,这些特性都有助于节约消息本身的大小。 Key 用来标识具体的 field,在解包的时候,Protobuf 根据 key 就能知道相应的 Value 对应于消息中的哪一个field,数据类型是哪个类型。 Key 的定义如下: Key 由两部分组成:第一个部分是 field_number,比如上篇文章定义的消息 FooSimpleMessage 中的 msgId 属性的 field_number 为1;第二部分为 wire_type,表示 Value 的传输类型 表1. Wire Type 在之前的例子中,msgId 采用的数据类型为 int32,因此对应的 wire_type 为0,所以对应的 tag 为 FooSimpleMessage 的 msgContent,field_number 为2,wire_type 为2,所以对应的 tag 为 对应 Length-delimited 的 wire type,后面紧跟着的 Varint 类型表示数据的字节数。所以 msgContent 的 key 后面紧跟着的 0x1a 表示后面的数据长度为10个字节,"A protobuf message content" 的 ASCII 值即为: 0x41 0x20 0x70 0x72 0x6f 0x74 0x6f 0x62 0x75 0x66 0x20 0x6d 0x65 0x73 0x73 0x61 0x67 0x65 0x20 0x63 0x6f 0x6e 0x74 0x65 0x6e 0x74 在 Demo 里面定义的 msg 对象,其序列化后的数据的十六进制表示应该为 0801121a 41207072 6f746f62 7566206d 65737361 67652063 6f6e7465 6e74 运行demo,打印一下结果和猜想的一样: 参考地址: Protocol-buffers Encoding

无 proto文件即不知道服务端的.proto文件格式 客户端能不能解析成普通易懂的string

Protocol Buffers的是一个高效且可扩展的格式结构化数据编码的一种方式。谷歌使用了Protocol Buffers的几乎所有它的内部RPC协议和文件格式使用protobuf传输的好处有:二进制传输,安全、数据量小.proto文件中我们服务器定义需要传输的数据,及数据类型等。而传输的时候则是使用了通过官方工具生成的具体为.java的消息体

wireshark内置支持protobuf吗

只要你装了WINPCAP 就可以自己编程抓包,或使用wireshark抓包了。但是无线网卡好像无法通过winpcap抓包,具体如何实现无线网卡抓包,还没有研究过。6930p自带网卡绝对可以抓包,我开发网络抓包程序就是通过笔记本实现的,网卡也是我的三星笔记本自带的。

Swift 安装protobuf

1、官方项目地址: https://github.com/apple/swift-protobuf 2、拉取项目到本地 3、进入项目本地路径,查看版本 4、根据项目需要,选择版本编译 如:1.5.0 5、构建项目 6、构建完成之后会生成一个 protoc-gen-swift 执行路径:swift-protobuf/.build/release/protoc-gen-swift7、把protoc-gen-swift文件直接拷贝到/usr/local/bin目录下 8、swift版本的protobuf已安装完成,现在可以来测试使用 准备一个proto文件(Book.proto) 9、生成swift文件 10、把生成的Book.swift文件拖入到项目中就可以使用了

为什么google protobuf不支持map的序列化和反序列化

现在它是支持的。proto2的文档就已经提到了Maps(Language Guide),但我用protoc2.6编译的时候,map关键字无法通过编译,protoc3.0编译正常,proto举例:message Person { required int32 id = 1; required string name = 2; optional string email = 3; map<string, string> values= 4; } 另外,官方文档(https://developers.google.com/protocol-buffers/docs/proto#Maps)说了:The map syntax is equivalent to the following on the wire, so protocol buffers implementations that do not support maps can still handle your data:message MapFieldEntry { key_type key = 1; value_type value = 2;}repeated MapFieldEntry map_field = N;

怎么将protobuf string类型

2.下载一个protobuf-java-2.4.1.jar文件(注意,要与你刚才下的proto.exe版本相同)然后就开始开发了。步骤:1.用记事本编写一个.proto文件:}如:编写的是test.proto package protobuf; option java_package = "com.sq.protobuf"; option java_outer_classname = "FirstProtobuf"; message testBuf { required int32 ID = 1; required string Url = 2; }将其放在与刚解压的protoc.exe同级目录中。2.在cmd中,到protoc-2.4.1-win32文件夹下,执行E:protoc-2.4.1-win32> protoc.exe --java_out=./ test.proto 则可以找到的一个生成的FirstProtobuf.java文件。3.在MyEclipse中新建一个java project,建立包com.sq.protobuf,然后将刚才生成的FirstProtobuf.java文件放在其下面。此时会报错,因为没有引入jar包,在package视图下,将protobuf-java-2.4.1.jar引入,即可解决问题。

一个案子Proto阶段的定义是什么?需要做些什么?proto后面是EVT,DVT,PVT

打样, 料件及整机模具开发调试阶段

proto-horse什么意思?

proto-horse原马proto [词典] 原型机,样机;[网络] 原; 普罗托; 协议;[例句]What"s Generated From Your. proto?从你的.proto文件生成了什么?horse 英[hɔ:s]美[hɔ:rs]n. 马; 骑马的军人,骑兵; 有脚的架; 跳马,鞍马;vt. 为…备马; 猛推或用力向上举;vi. 欲交配,,用于母马;[网络] 黑马; 跳马; 房子;[例句]A small man on a grey horse had appeared.一个骑着灰马的小个子男人出现了。[其他] 第三人称单数:horses 复数:horses 现在分词:horsing 过去式:horsed 过去分词:horsed

protobuf repeated 怎么用的

protobuf repeated类型的使用protobuf是Google开发的一个序列化框架,类似XML,JSON,基于二进制,比传统的XML表示同样一段内容要短小得多。通过protobuf,可以很轻松的调用相关方法来完成业务数据的序列化与反序列化。protobuf repeated类型相当于std的vector,可以用来存放N个相同类型的内容,文章将简单介绍protobuf repeated的使用。首先定义一个protobuf结构,如下:message Person { required int32 age = 1; required string name = 2;}message Family { repeated Person person = 1;}下面以例子简单说明如何使用:int main(int argc, char* argv[]){ GOOGLE_PROTOBUF_VERIFY_VERSION; Family family; Person* person; // 添加一个家庭成员,John person = family.add_person(); person->set_age(25); person->set_name("John"); // 添加一个家庭成员,Lucy person = family.add_person(); person->set_age(23); person->set_name("Lucy"); // 添加一个家庭成员,Tony person = family.add_person(); person->set_age(2); person->set_name("Tony"); // 显示所有家庭成员 int size = family.person_size(); cout << "这个家庭有 " << size << " 个成员,如下:" << endl; for(int i=0; i<size; i++) { Person psn = family.person(i); cout << i+1 << ". " << psn.name() << ", 年龄 " << psn.age() << endl; } getchar(); return 0;}

android studio的proto文件放在哪

方案是:1、在build.gradle中增加dependencies { compile fileTree(dir: "libs", include: ["*.jar"]) compile group:"com.google.protobuf",name:"protobuf-java",version:"2.5.0" //这个是关键的一句话,对于这个version是从你的本地maven存放的目录, 进入到 .m2 epositorycomgoogleprotobufprotobuf-java目录下,看到的那个数字文件夹的名字,就是你的version,

在proto 中如何将字符串封到bytes

Configuration conf = HBaseConfiguration.create(); String tableName = "testTable"; Scan scan = new Scan(); scan.setCaching(10000); scan.setCacheBlocks(false); conf.set(TableInputFormat.INPUT_TABLE, tableName); ClientProtos.Scan ...

protobuf 怎么查看版本

protobuf版本需要在protobuf程序中查看。在protobuf程序中查看版本步骤如下所示:1、点击打开计算机,进入分区列表。2、在计算机分区列表中选择protobuf程序所在的文件夹。3、点击打开protobuf程序。4、如图所示在protobuf程序中,即可完成protobuf版本查看。

PROTO什么意思

PROTO原abbr.protoporphyrinogen 原卟啉原,初卟啉原; 答题不易答案满意采纳谢谢思密达ps:如有问题继续追问

protobuf可变长度原理

这篇文章在你已经了解protobuf使用的基础上,更进一步的学习,如果不知道protobuf是什么?请查阅这篇文章 【golang-protobuf使用】 官网说明地址: https://developers.google.com/protocol-buffers/docs/proto3 proto文件的可变长度类型有:int32、int64、uin32、uin64、sint32、sint64 Protobuf 用的是连续位标识技术,使用每个字节的第一位来标识是否需要继续向后读。每个字节低7位用于实际的编码。 举例: 十进制:300 二进制(4个字节):00000000 00000000 00000001 1000000 protobuf编码过程 所以最终编码结果为 1 0000000 0 1100000,这样将4字节存储大小转化为2字节存储大小 目标:将10^32bit的二进制进行编码 proto文件格式 测试结果: 由测试结果可得如果高位(左边)字节为0,编码结果大小相应减少

protobuf 怎么查看版本

protoc --version

proto3怎么判断字段是否被赋值

客户端lua,通信协议是protobuf,以前用网易的proto-gen-lua,使用过程遇到些问题需要绕,比如: 1、每次更改、增加proto都要生成新的文件,代码规模剧增 2、由于lua本身,每个文件最大文件内全局local变量不能超过200个,所以当proto规模太大时...

怎样用正则表达式删除PROTO及紧跟的()? 例void PROTO(main)(void)变为void main(void)却不删除main

s/PROTO([^.]+)/$1

proto 没有set

protobufrepeated的数据类型和C++的Vector,list类似,只能传输相同的数据类型。当然,如果你为了传输多种数据类型,可以使用类似与C++union的方式,用个大消息,消息的每个字段都使用optional标记,你在业务处理的时候,每次只对一个字段赋值同样可以达到目的。另外:repeated只能表示数据有还是没有,在没有的时候,究竟是保留原有的数据不动,还是删除所有数据,这点有歧义。需要使用另外的字段进行处理。

linux ping命令中的struct proto

可以使用,相当与函数地址作为一个常量值赋值给结构体变量函数proto_v4 = { proc_v4, send_v4, NULL, NULL, 0, IPPROTO_ICMP };等同于:proto_v4 = { &proc_v4, &send_v4, NULL, NULL, 0, IPPROTO_ICMP }即取函数地址指针。

Protocol Buffers(Objective-C)踩坑指南

这篇文章是讲如何把protobuf文件的编译工作集成到Xcode中,达到在Xcode中就像添加一般的OC文件一样不进行任何多余的操作直接编译运行.proto文件的目的。 牛逼,这么智能吗?是的,就是这么智能! 笔者的公司现在所有端都在统一使用一套protobuf数据结构,免除了多端重复定义同一套数据结构的重复工作,效率很高,非常值得推荐。并且Xcode 10进行了一些小优化来增加了对Protobuf的支持,相信不久以后,Xcode对Protobuf的支持将更加智能! 至于什么是 Protobuf 和 Protobuf 语法教程,不是这篇文章的主题,请自行Google。 环境:Xcode 10+ 语言:Objective-C 话不多说,正题开始: 首先,真正的企业级项目,并不只是网上很多教程里面演示的一两个 .proto 文件,而是一批 .proto 文件目录的集合,并且是多端共享的。你会发现按照那些教程里面的讲的去做写个demo或许可以,但是真正要达到企业级别的使用的时候,还远远不够,你会遇到各种各样的坑。别问我是怎么知道的,我都是靠自己一个个踩出来的。 首先,要能编译Protobuf文件,我们得安装官方的编译器。你可以选择下面任意一种你喜欢的安装方式: 安装好后,在terminal中输入 which protoc 检测是否安装成功,如安装成功会返回文件路径: /usr/local/bin/protoc 如有问题,请自行google,不在本教程范围内。 没什么好说的,新建一个Xcode工程。使用Cocoapods引入Protobuf的库: Pod search Protobuf 选择最稳定的版本即可。 这里有两种创建.proto文件的方式: 至于文件内容,如果你熟悉protobuf语法,那随便写几行即可,如果不熟悉,那么可以copy我的测试内容: A.proto 文件内容: B.proto 文件内容: Xcode 自己并不认识 .proto文件,所以并不会自动编译它们,我们需要把 .proto编译器 自己集成到项目当中,集成的方式如下: Project --> Build Rules --> 点击+号 ,生成一个特定文件类型编译脚本。 比如: 到此处,我们有几个注意事项: 我们试试把 --proto_path 换成相对路径,看会发生什么,也就是把脚本换成 编译运行,咦~报错了。查看日志,我们可以看到这么一条log信息: 翻译过来就是在--proto_path这个参数中你必须指定.proto源文件的精确路径, protoc 太笨了,它无法搞清楚这个相对路径是不是我们要的绝对路径。google的工程师说这太他么难了。所以这里很明确了, --proto_path 的参数值,只能是proto文件根目录的绝对路径。 我们上面说了,${INPUT_FILE_PATH} 是代表编译输入源文件的绝对路径。 文档里面给的demo是: protoc --proto_path=src --objc_out=build/gen src/foo.proto src/bar/baz.proto 什么意思呢? 它说,最终编译器会把 src/foo.proto 文件编译成: build/gen/Foo.pbobjc.h 和 build/gen/Foo.pbobjc.m 文件。 而会把 src/bar/baz.proto 文件编译成 build/gen/bar/Baz.pbobjc.h 和 build/gen/bar/Baz.pbobjc.m 。 而不是 build/gen/Baz.pbobjc.h 和 build/gen/Baz.pbobjc.m 也就是说protobuf编译器最终生成的文件会自动按照文件源目录结构存放。 特别强调 并不会 自动创建 build/gen 目录,这个目录需要你提前建好。 并且,查看最终编译生成的.m文件,你会发现一些有趣的事情;比如我在A.proto中引入了B.proto文件,你会看到Protobuf最终编译出来的A.pbobjc.m文件导入文件的格式是包含文件路径的,例如: 我们注意到,上面设置的proto文件的编译输出路径是 $DERIVED_FILE_DIR , 这是为何呢? 答案是为了方便Xcode的集成。 对于自定义的编译脚本,都需要设置一个文件的输出路径. 我们点脚本框下面的Output Files下面的 + 号, 指定文件输出路径。 因为OC文件分为.h和.m文件,所以我们指定2个。 点了之后,你会发现,xcode默认给出的是 $(DERIVED_FILE_DIR)/newOutputFile , 我们将其改为 $(DERIVED_FILE_DIR)/${INPUT_FILE_BASE}.pbobjc.h 和 $(DERIVED_FILE_DIR)/${INPUT_FILE_BASE}.pbobjc.m ,并且在.m文件的 Compiler Flags 中指定为 -fno-objc-arc 代表该.m文件采用mrc编译。 编译运行,大功告成,是不可能的!!!! 你会发现又报错了: 什么意思呢? 其实就是在 DerivedSources 下找不到 A.pbobjc.m 文件。因为我们指定这个编译的输出路径在这个目录下,所以Xcode在进行OC文件的编译时会去这个目录下找,但是它找不到。为什么找不到呢?我们去这个目录下看,这个目录下确实没有 A.pbobjc.m 这个文件,但是确发现有 a/A.pbobjc.m 。原因我们已经说了,protoc最终的编译文件会自动加上目录前缀。 有人可能会说,能不能把输出文件改成 $(DERIVED_FILE_DIR)/*/${INPUT_FILE_BASE}.pbobjc.h 呢?那我们就来试下。 编译运行 what the hell? 原来,Xcode的Output Files特别蠢,它不支持类似这种通配符写法: $(DERIVED_FILE_DIR)/*/${INPUT_FILE_BASE}.pbobjc.h 。 也不支持传入任何的自定义变量。 只能是明确的文件路径和Xcode自带的环境变量,但是实际项目中,可能不只一层路径,有可能是文件夹下嵌套文件夹。 靠,那这怎么办呢? 实在没办法了,就在打算放弃的时候,咨询了我们的脚本大神,我们尝试了以下在脚本末尾再加了两行: 是不是很机智? 什么意思呢?就是说我们cd到该目录,然后找到该文件对应生成的oc文件,将其copy一份儿到根目录。怀着求神拜佛的意志,运行了以下,Perfect,终于不再报错了,到目录中查看,也正是我们想要的,所有文件都被copy出来了。 下一步,就是正常的在项目中import和使用了。 你以为到此就没有坑了吗?到此还有坑。有2点需要注意: 好了,就讲到这里吧,如果觉得文章看得不是很明白,需要一个demo。或者大神有更好的建议,请在评论区留言~ 如果文章对你有帮助,请不要吝啬你的点赞哦,你的支持是我分享的动力~ 如果大家喜欢,有时间再讲讲怎么改改AFNetworking,能直接请求后端给的 Protobuf 格式的数据~

vue使用protobuf+websocket

我的教程是用protobuf生成了proto.js文件 1、运行npm install protobufjs --save 安装 2、拿到后台给的proto文件,在src里创建一个proto目录,用于存放proto文件及编译后的js文件 proto 3、运行命令 生成proto.js文件,如图 4、使用 websocket返回的数据是model.data 官方git教程 https://github.com/protobufjs/protobuf.js

.proto 文件怎么生成.h文件

打开命令行程序,输入如下语句: protoc -I=../script --cpp_out=../protoc ../script/Package.proto 将会产生两个名为Package.pb.cc和Package.pb.cc的文件。

为什么google protobuf不支持map的序列化和反序列化

现在它是支持的。proto2的文档就已经提到了Maps(Language Guide),但我用protoc2.6编译的时候,map关键字无法通过编译,protoc3.0编译正常,proto举例:message Person {required int32 id = 1;required string name = 2;optional string email = 3;map<string, string> values= 4;} 另外,官方文档(https://developers.google.com/protocol-buffers/docs/proto#Maps)说了:The map syntax is equivalent to the following on the wire, so protocol buffers implementations that do not support maps can still handle your data:message MapFieldEntry {key_type key = 1;value_type value = 2;}repeated MapFieldEntry map_field = N;

python如何通过protobuf实现rpc

由于项目组现在用的rpc是基于google protobuf rpc协议实现的,所以花了点时间了解下protobuf rpc。rpc对于做分布式系统的人来说肯定不陌生,对于rpc不了解的童鞋可以自行google,这里只是做个简单的介绍。rpc的主要功能是让分布式系统的实现更为简单,为提供强大的远程调用而不损失本地调用语义的简洁性。为了实现这个目标,rpc框架需要提供一种透明调用机制让使用者不必显示区分本地调用还是远程调用。rpc架构涉及的组件如下:客户方像调用本地方法一样去调用远程接口方法,RPC 框架提供接口的代理实现,实际的调用将委托给代理RpcProxy 。代理封装调用信息并将调用转交给RpcInvoker 去实际执行。在客户端的RpcInvoker 通过连接器RpcConnector 去维持与服务端的通道RpcChannel,并使用RpcProtocol 执行协议编码(encode)并将编码后的请求消息通过通道发送给服务方。RPC 服务端接收器 RpcAcceptor 接收客户端的调用请求,同样使用RpcProtocol 执行协议解码(decode)。解码后的调用信息传递给RpcProcessor 去控制处理调用过程,最后再委托调用给RpcInvoker 去实际执行并返回调用结果。protobuf rpc在上面组件中主要扮演RpcProtocol的角色,使得我们省去了协议的设计,并且protobuf协议在编码和空间效率都是上非常高效的,这也是很多公司采用protobuf作为数据序列化和通信协议的原因。同时protobuf rpc定义了一个抽象的rpc框架,如下图所示:RpcServiceStub和RpcService类是protobuf编译器根据proto定义生成的类,RpcService定义了服务端暴露给客户端的函数接口,具体实现需要用户自己继承这个类来实现。RpcServiceStub定义了服务端暴露函数的描述,并将客户端对RpcServiceStub中函数的调用统一转换到调用RpcChannel中的CallMethod方法,CallMethod通过RpcServiceStub传过来的函数描述符和函数参数对该次rpc调用进行encode,最终通过RpcConnecor发送给服务方。对方以客户端相反的过程最终调用RpcSerivice中定义的函数。事实上,protobuf rpc的框架只是RpcChannel中定义了空的CallMethod,所以具体怎样进行encode和调用RpcConnector都要自己实现。RpcConnector在protobuf中没有定义,所以这个完成由用户自己实现,它的作用就是收发rpc消息包。在服务端,RpcChannel通过调用RpcService中的CallMethod来具体调用RpcService中暴露给客户端的函数。介绍了这么多,对于怎么样用protobuf rpc来实现一个rpc肯定还是一头雾水吧,下面就用protobuf rpc来实现一个简单的python版rpc demo吧。下面直接给出demo描述PRC的proto文件,至于proto文件的编写规则可以参考protobuf官网。common.proto文件:package game;message RequestMessage{ required string message = 1;}message ResponseMessage{ required string message = 1;}game_service.proto文件:package game;import "common.proto";option py_generic_services = true;service GameService{ rpc connect_server(RequestMessage) returns(RequestMessage);}common.proto文件描述了RPC中收发的消息;game_service.proto描述了服务器导出的connect_server函数,该函数接受RequestMessage对象作为参数,并返回RequestMessage对象。在使用PRC协议时,必须加上option py_generic_services = true;可选项,要不然编译器不会生成包含connect_server函数的GameService描述。使用编译器protoc编译proto文件,具体命令为:protoc.exe --python_out=. game_service.proto编译后生成的文件为game_service_pb2.py,该文件主要是实现了GameService和GameService_Stub类。GameService_Stub类用于客户端调用者来调用GameService的服务。前面已经说了,在客户端,RpcChannel只实现了一个空的CallMethod,所以需要继承RpcChannel重新这个函数来encode消息和发送消息。在服务端RpcChannel需要调用CallMethod来调用Service中的函数。具体实现如下:class MyRpcChannel(service.RpcChannel): def __init__(self, rpc_service, conn): super(MyRpcChannel, self).__init__() self.logger = LogManager.get_logger("MyRpcChannel") def CallMethod(self, method_descriptor, rpc_controller, request, response_class, done): """"protol buffer rpc 需要的函数,用来发送rpc调用""" self.logger.info("CallMethod") cmd_index = method_descriptor.index assert(cmd_index < 65535) data = request.SerializeToString() total_len = len(data) + 2 self.conn.send_data("".join([pack("最后就是继承GameService,并实现connect_server函数了。class GameService(game_service_pb2.GameService): def __init__(self): self.logger = LogManager.get_logger("GameService") def connect_server(self, rpc_controller, request, callback): self.logger.info("%s", request.message) 至于用于网络收发消息的RpcConnector,可以使用python的asyncore库实现,具体实现在这就不讨论了。从上面的实现来看,protobuf rpc的实现主要包括编写proto文件并编译生成对应的service_pb2文件,继承RpcChannel并实现CallMethod和调用Service的CallMethod,继承Service来实现暴露给客户端的函数。

java中.proto文件怎么用

用cd命令打开文件所在目录,例如文件在E: oolsComputerprotoc-2.5.0-win32下cmd命令:e:E:>cd tools

为什么Protobuf的默认序列化格式没有包含消息的长度与类型

编译后protobuf形成对应的文件,加入工程,创建你的消息对象,给里面的成员赋值,然后将这个对象转化为字节流,用socket函数直接write出去即可。

android studio怎么编译proto

方案是:1、在build.gradle中增加dependencies { compile fileTree(dir: "libs", include: ["*.jar"]) compile group:"com.google.protobuf",name:"protobuf-java",version:"2.5.0" //这个是关键的一句话,对于这个version是从你的本地maven存放的目录, 进入到 .m2 epositorycomgoogleprotobufprotobuf-java目录下,看到的那个数字文件夹的名字,就是你的version,

怎么样编写Protobuf的.proto文件

ProtoBuf java 包编译ProtoBuf的官方下载包并不包含jar文件,需要用户自己configure/make….来自行编译。由于Windows上没有编译环境,就用了一个笨一点方法处理了。分别下载:protobuf-2.4.1.zip ProtoBuf的源文件(包含了C++/Java/Python)的源文件protoc-2.4.1-win32.zip 已经编译过的用于Windows平台的protoc命令(该命令用于将.proto文件转化为Java或C++源文件)。分别解析这两个文件,你可以在protoc-2.4.1-win32.zip解压后的文件中找到一个protoc.exe文件,将其copy到protobuf-2.4.1/src目录下,然后进入protobuf-2.4.1/java,执行:mvn install

电脑网络信息:Proto. Local Address Foreign Address. State TCP和UDP 等各是什么意思?定义是?

你这个可以通过netstat-b命令来查看!Proto你的电脑连接对方服务器或电脑所用协议Localaddress本地计算机地址和连接目的地址所用的端口foreignaddress你的电脑连接目的IP和对方跟你连接所用的端口state是提示你连接的状态是否成功TCP和UDP都是网络协议

proto 转json 值类型错误 python

解决方法如下:1,protobuf下载安装。2,新建目录example。3,上面步骤做好之后,下面我们需要用python实现基于protobuf协议将json转化为pbstring,将pbstring转成json。

c语言中PROTO是什么意思

这不是写得很明白吗?#if _HW_ #define PROTO #else #define PROTO extern#endifPROTO是extern的别名

macbook下eclipse使用proto

先确认你的Mac上是否已安装java运行环境。具体步骤如下:1、进入终端,输入java-version,如果返回了java版本号,则说明已安装,否则,会弹出先安装java运行环境的提示。2、访问Oracle官网,浏览到首页的底部菜单,选择JAVA选项下面的DOWNLOADJAVAFORDEVELOPERS。3、点击“JDKDOWNLOAD”按钮。4、选择“AcceptLisenceAgreement”同意协议。5、点击MacOSXx64后面的下载链接。勾选ACCEPTLICENSEAGREEMENT,选择下面MAC开头的下载包。6、下载完成后点击安装包,按提示即可完成安装。7、打开终端,输入:/usr/libexec/java_home-V。8、会出现3个红框内依次为:输入命令,当前Mac已安装jdk目录,Mac默认使用的jdk版本。其中Contents下的Home文件夹,是该JDK的根目录。最后根据进程设置环境变量即可,具体代码可在网上查询到。

ProtoBuf简介

ProtoBuf是一种无关语言,无关平台的序列化结构数据的方法,可用于通信协议、数据存储等 XML:数据较为冗余,需要成对的闭合标签 JSON:使用键值对方式,压缩了一定的数据空间并且具有可读性 ProtoBuf:适合高性能,对响应速度有要求的数据传输场景,ProtoBuf是二进制数据格式,需要解码和编码,数据本身不具有可读性,只能反序列化后才能读到真正的数据。序列化后的数据相比json和xml很小,适合网络传输;序列化和反序列化比json的处理速度更快。 XML、JSON 更注重数据结构化. ProtoBuf更注重数据序列化,关注效率、空间、速度 数据类型分为两大类: 复合数据类型:枚举和message类型 标准数据类型:整型,浮点,字符串 规则的修饰符: required 字段必须出现1次 optional 字段可出现0次或1次 repeated 字段可出现多次(包括0) 标准数据类型: proto与python类型对应 例如:

"proto"是什么品牌中文名是叫什么

思派朗 编辑来自韩国Proto汽车公司,只不过现在Proto已经被翱欧邻(OULLIM)投资集团收购的超级跑车,此车改写了韩国没有超级跑车的历史。

在项目中使用Protobuf协议实现数据传输(二)

上篇已经简单的分析了什么是ProtoBuf协议的优缺点、简单的环境配置、项目中的简单使用和一些编写.Proto文件的注意点,下面我们更加深入一下ProtoBuf的语法及高级使用(非常感谢Carson_Ho大神的博文指导) 作用 :防止不同 .proto 项目间命名 发生冲突 ProtoBuf包的解析过程如下 : 作用 :影响 特定环境下 的处理方式,但不改变整个文件声明的含义 常用Option选项 :(因为使用有限,简单列举常见的) 作用 :真正用于描述 数据结构 在.proto消息模型中主要有 消息对象&字段 组成 :字段 = 字段修饰符 + 字段类型 +字段名 +标识号(主要针对proto2以前版本) 字段 = 字段类型 +字段名 +标识号(主要针对proto3及以后版本) 一个消息对象 可以将 其他消息对象类型 用作字段类型 关于ProtoBuf在项目中的实践的高级用法请关注:下一篇博客:在项目中使用Protobuf协议实现数据传输(三)

现代汽车体系中PROTO 是什么意思

Proto是一家南韩的汽车公司, 地位为运动型汽车.应该不是一家很大的车厂, 主要通过与现代,起亚等大公司合作来生产自己品牌的车. 1997年开始至今没几个车型. 不是很出名的. 2001年proto给韩国总统府,(在职总统的家),定制了一款LIMO, 豪华轿车

proto是意大利哪个地方?

普拉托镇(Prato),位于意大利中北部的托斯卡纳地区。在佛罗伦萨西北13公里的比森齐奥河畔。

PROTO什么意思?

proto-表示“第一, 主要”之义例如:表示“第一, 主要, 原始, 最初”, 如:proto -Arabic

proto是什么阶段

proto打样, 料件及整机模具开发调试阶段 EVT, Engineering Validation Test 是针对工程原型机的验证,对象很可能是一大块开发板,或是很多块开发板;关键是要有足够时间和样品。 通常,如果是新平台,需要花的时间和精力可能更多,会有很多问题要解决,甚至有很多方案要对比;而修改既有产品的话,这个阶段会简单很多,甚至省略。 这一阶段的重点是尽可能多的发现设计问题,以便及早修正;或者说设计可行性的验证。同时检查是否有规格被遗漏。 主要由研发部门来执行。

PROTO什么意思?

proto英 [pru0259u028atu0259]美 ["proto]n. 原型;样机;典型n. (Proto)人名;(意)普罗托

ie8中使用Array.prototype.splice.call对伪数组进行删除时为什么不能删除?

ufefffunctionbox(arr){this.arr=arr;}box.prototype.aa=function(){this.ori=[].concat(this.arr);for(vari=0;i<this.arr.length;i++){for(varj=i+1;j<this.arr.length;j++){if(this.arr[i]==this.arr[j]){this.arr.splice(j,1);}}}alert("原来的是:"+this.ori+" "+"去重后:"+this.arr);}varnum=newbox([1,5,10,8,20,7,4,2,4,5,3,1,19,20]);num.aa();

ie8中使用Array.prototype.splice.call对伪数组进行删除时为什么不能删除?

因为数组应该是for(let i=0;i<list.length;i++){console.log(list.item(i))才能删除。解决步骤如下:1、首先第一步就是要进行getElementsByTagName 得到的是 HTMLCollections类注意的是有一个ID为"test"的元素,可以直接取得。2、接着就是这时候进行querySelector 得到的是 NodeList注意的是document.querySelectorAll("div").forEach((a,b,c)=>{console.log("第一个参数:" + a + "值");console.log。3、然后就是通过控制台观察发现,两者都具备iterator接口,都可以支持for ... of语相比来讲,援引Arguments来。4、最后一步就是进行ie8中使用Array.prototype.splice.call对伪数组的删除,这时候就可以删除成功了会有提示的,如下图所示。

虐杀原形我下下来怎么是Prototype-Razor1911一个文件怎么安装啊?

1.解压压缩包2.推荐用DaemonTools最新版载入镜像安装游戏3.安装完成后从镜像里Razor1911文件夹复制破解补丁到游戏安装目录即可进入游戏。4.运行游戏

reprotoxicity 是什么意思

试了一下,直接翻译这个词翻译不出来,但是把这个词隔开就可以了,repro toxicity:重现毒性。repro:再现。toxicity:毒性。不知道是不是这个意思,这种专业词汇比较难查,你看看这个意思能不能适合你的语境。一点愚见,仅供参考。

thrift文件怎么转成proto文件

南和文档完备上高出一个档次。protobuf是google提供的一个开源序列化框架,类似于XML,JSON这样的数据表示语言,其最大的特点是基于二进制,因此比传统的 XML表示高效短小得多。虽然是二进制数据格式,但并没有因此变得复杂,可以很方便的对其基于二进制的协议进行扩展,并且很方便的能让新版本的协议兼容老的版本。如果说xml太臃肿,json易解析,比xml更高效,易扩展,那么protobuf可以说,相对于json更高效,更易扩展,而且协议的保密性更强。并且protobuf是跨语言的,可以支持c(c++),Java,Python等主流语言,非常方便大系统的设计。protobuf号称也有service,可以基于其service的接口和回调,来完成客户端和服务器的逻辑。但是,目前版本service还仅仅停留在接口层,其底层的通讯,还需要自己实现,这点确实远不如thrift完备。protobuf + netty ?

rpc框架:thrift 和protobuf有什么区别?

fastrpc protobuf的一个全部开源的高性能rpc实现,支持客户端跨平台 中国人写的

nuke rotopaint印章工具怎么缩小

点右键,设置半径就可以了!

ROTOCLONE湿式除尘器是如何除尘的?

湿式除尘器是用水或其他液体与含尘气体互相接触实现分离捕集粉尘粒子的装置。它是基于含尘气体与液体接触。借助于惯性碰撞、扩散等机理,将粉尘予以捕集。这种方法简单、有效,因而在实际中得到相当广泛的应用。

断桥铝内开内倒窗,roto五金件坏了,打不开

买套新的质量好的五金件换上

为什么nuke roto节点线不消失

你是不是想问nukerotor节点锁住了怎么开?安装你所需要的Nuke版本。找到 rlm 文件夹下的 foundry.lic 文件,使用记事本打开此文件。将主机名 替换为 本地主机名。将物理地址 替换为 本地物理地址,(物理地址去除中间所有符号“-”)拷贝 rlm文件夹 到 C盘根目录下。“cmd.exe”,然后以管理员身份运行 cmd.exe 程序。

请问roto finish是什么意思?

旋转完成

Ae视频抠像,除了roto笔刷还有其他的方法吗

如果你不嫌麻烦还有几种方法。就是使用其他软件。如Photoshop这些。还有使用遮盖的方法抠图。你自己可以去自学网里面看看。有些就是一看就自己知道了。考虑半天一点头绪也没有

AE 用roto只能抠一帧,然后剩下的就都扣不动,动不了了!!求解!!怎么办?重装过了也没用

你都有第一个图了,就不要再用keylight来修那个小黑点了,那人物受影响很正常。用简单的遮罩排除黑点就好了啊。<

使用nuke roto的时候切到别的工具线断了,线自己封闭了,怎样继续画

你用NUKE的时候继续点击图像便是的那个有个弧形中间一个点的工具,把他选中你之前断的那个地方,可以将其延伸,继续绘制,有点类似pfcheack这个工具。

有人知道新西兰的Rotolua罗托鲁瓦吗?? 那城市是个什么类型的? 生活便利吗,跟惠灵顿比呢

首先,英文应该是Roto-r-ua。Rotorua位于北岛中部,与奥克兰惠灵顿比,是个中小城市。不过和中国的一般城市比,新西兰所有城市都不大,主要是人口和建筑显得稀少,大多是一望无际的绿地,小山,湖泊,和绵延不断的海岸线。城市类型:是个生活非常舒适,遍布美景的旅游城市,但不是商业城市。和惠灵顿比:我在惠灵顿,感觉这两个城市完全不同,没什么可比性。惠灵顿是首都,非工商业中心,是新西兰的政治和文化中心,大多工作是政府机关和服务性的,市中心比较“现代化”。但新西兰人最不喜欢的即是我们引以为豪的高楼大厦,他们崇尚自然。这就是为何我们可以说中国是个农业+工业国,但新西兰人宁愿是个农/畜牧业国。正因如此,这个欧式小国是牛羊肉和乳制品的第一大出口国。生活便利程度:如果指中餐馆和华人店的的多少,大城市会多些,因为华人相对多些。如果指生活质量,没丝毫区别。新西兰在南半球,是个远离喧嚣世界的发达国家,而发达国家和发展中国家的区别之一即是:~~发达国家~~生活在社会最底层的,也有厅室厨厕和停车位的房子住,也开得起车,也有钱出国小游一把。。。~~发展中国家~~有人能上世界富人榜,但最底层的上不起学,看不起病。。。最后上几张Rotorua和这个小城附近的照

在nuke里建立roto节点后,画了一个矩形框,在roto的属性里将output到alpha,可为什么在viewer里切换到alp

你上面是不是还有图层啊,预乘一下或许就行了

roto air空气净化器在换了滤网,为什么灯还是红色的?

在风吹干你的散发时,我简直着魔了:在闪闪发光的披肩柔发中,在淡淡入鬓的蛾眉间,在碧水漓漓的眼睛里 ……你竟是如此美丽可人!

为什么nuke roto节点线不消失

你是不是想问nukerotor节点锁住了怎么开?安装你所需要的Nuke版本。找到 rlm 文件夹下的 foundry.lic 文件,使用记事本打开此文件。将主机名 替换为 本地主机名。将物理地址 替换为 本地物理地址,(物理地址去除中间所有符号“-”)拷贝 rlm文件夹 到 C盘根目录下。“cmd.exe”,然后以管理员身份运行 cmd.exe 程序。
 1 2 3 4 5  下一页  尾页