天道酬勤,学无止境

Protobuf-3:如何解决缺少的方法“getIdCase()”? 使用“--experimental_allow_proto3_optional”生成的类(Protobuf-3: How to resolve missing method "getIdCase()" ? Classes generated with '--experimental_allow_proto3_optional ')

问题

我使用了 proto3_optional,并且在“可选”字段上缺少这个 xxCase() 方法。 有解决方法吗?

生成的消息类“muni.model.Model$Person”缺少方法“getId Case

NoSuchMethodException: muni.model.Model$Person.getId Case()

注意:我需要保留用于验证对象的 hasXX() 方法和用于反序列化的 JsonFormat.printer(myproto) 方法。

原型对象

message Person{
  //Output only
  optional string id = 3; // "muni.model.Model$Person" missing method "getIdCase"
  optional string firstName = 4; // optional added to test hasFirstName()
  optional string lastName = 5;
  optional string email = 6;
  optional string phone1 = 7;
  optional string phone2 = 8;
  PostalAddress address = 9; //For objects no need for optional, hasAddress() works
  bool dirty = 10;//for boolean getDirty() default behavior works, no need for optional
  //Output only
  google.protobuf.Timestamp createTime = 1;
  //Output only
  google.protobuf.Timestamp updateTime = 2;
}

关于缺少方法的错误


app.api.AppException: Error converting Proto to json

    at muni.util.ProtoUtil.toJson(ProtoUtil.java:14)
    at app.PersonResourceTest.personById(PersonResourceTest.java:19)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at io.quarkus.test.junit.QuarkusTestExtension.runExtensionMethod(QuarkusTestExtension.java:756)
    at io.quarkus.test.junit.QuarkusTestExtension.interceptTestMethod(QuarkusTestExtension.java:663)
    at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115)
    at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105)
    at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106)
    at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149)
    at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140)
    at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84)
    at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115)
    at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105)
    at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106)
    at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64)
    at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45)
    at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37)
    at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104)
    at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98)
    at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:212)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:208)
    at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:137)
    at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:71)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:135)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125)
    at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
    at java.base/java.util.ArrayList.forEach(ArrayList.java:1540)
    at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125)
    at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
    at java.base/java.util.ArrayList.forEach(ArrayList.java:1540)
    at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125)
    at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
    at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32)
    at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
    at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51)
    at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:248)
    at org.junit.platform.launcher.core.DefaultLauncher.lambda$execute$5(DefaultLauncher.java:211)
    at org.junit.platform.launcher.core.DefaultLauncher.withInterceptedStreams(DefaultLauncher.java:226)
    at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:199)
    at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:132)
    at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:69)
    at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)
    at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:230)
    at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:58)
Caused by: java.lang.RuntimeException: Generated message class "muni.model.Model$Person" missing method "getIdCase".
    at com.google.protobuf.GeneratedMessageV3.getMethodOrDie(GeneratedMessageV3.java:1847)
    at com.google.protobuf.GeneratedMessageV3.access$1000(GeneratedMessageV3.java:79)
    at com.google.protobuf.GeneratedMessageV3$FieldAccessorTable$SingularFieldAccessor$ReflectionInvoker.<init>(GeneratedMessageV3.java:2164)
    at com.google.protobuf.GeneratedMessageV3$FieldAccessorTable$SingularFieldAccessor.<init>(GeneratedMessageV3.java:2222)
    at com.google.protobuf.GeneratedMessageV3$FieldAccessorTable$SingularStringFieldAccessor.<init>(GeneratedMessageV3.java:2890)
    at com.google.protobuf.GeneratedMessageV3$FieldAccessorTable.ensureFieldAccessorsInitialized(GeneratedMessageV3.java:1977)
    at muni.model.Model$Person.internalGetFieldAccessorTable(Model.java:410)
    at com.google.protobuf.GeneratedMessageV3.getDescriptorForType(GeneratedMessageV3.java:133)
    at com.google.protobuf.util.JsonFormat$PrinterImpl.print(JsonFormat.java:764)
    at com.google.protobuf.util.JsonFormat$Printer.appendTo(JsonFormat.java:372)
    at com.google.protobuf.util.JsonFormat$Printer.print(JsonFormat.java:382)
    at muni.util.ProtoUtil.toJson(ProtoUtil.java:12)
    ... 66 more
Caused by: java.lang.NoSuchMethodException: muni.model.Model$Person.getIdCase()
    at java.base/java.lang.Class.getMethod(Class.java:2109)
    at com.google.protobuf.GeneratedMessageV3.getMethodOrDie(GeneratedMessageV3.java:1844)
    ... 77 more

涉及反序列化的任何地方都会发生错误

例如 jsonprint、System.out.println(myproto)。

import com.google.protobuf.Message;
import com.google.protobuf.MessageOrBuilder;
import com.google.protobuf.util.JsonFormat;


public class ProtoUtil {
    public static <T extends Message> String toJson(T obj){
        try{
            return JsonFormat.printer().print(obj);
        }catch(Exception e){
            throw new AppException("Error converting Proto to json", e);
        }
    }
...
}

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Protobuf-3: How to resolve missing method "getIdCase()" ? Classes generated with '--experimental_allow_proto3_optional '
    I used the proto3_optional, and getting this xxCase() method missing on field that are 'optional'. Is there a workaround for this? Generated message class "muni.model.Model$Person" missing method "getIdCase" NoSuchMethodException: muni.model.Model$Person.getIdCase() Note: I need to retain hasXX() method working for validating objects, and JsonFormat.printer(myproto) for deserializing. Proto object message Person{ //Output only optional string id = 3; // "muni.model.Model$Person" missing method "getIdCase" optional string firstName = 4; // optional added to test hasFirstName() optional string
  • 如何使用 R 中的 dplyr 将数据框中的行与多列配对?(How to pair rows in a data frame with many columns using dplyr in R?)
    问题 我有一个数据框,其中包含来自控制组和实验组的多个观察结果,每个主题都有重复。 这是我的数据框的示例: subject cohort replicate val1 val2 A control 1 10 0.1 A control 2 15 0.3 A experim 1 40 0.7 A experim 2 45 0.9 B control 1 5 0.3 B experim 1 30 0.0 C control 1 50 0.5 C experim 1 NA 1.0 我想将每个对照观察值与其对应的实验值配对,以计算对之间的比率。 所需的输出如下所示: subject replicate ratio_val1 ratio_val2 A 1 4 7 A 2 3 3 B 1 6 0 C 1 NA 2 理想情况下,我希望看到使用 dplyr 和管道实现这一点。 回答1 我们可以通过将数据集重塑为“宽”格式来使用data.table 。 library(data.table) dcast(setDT(df1), subject+replicate~cohort, value.var = c("val1", "val2"))[, paste0("ratio_", names(df1)[4:5]) := Map(`/`, .SD[, grep("experim", names(.SD))
  • 在thead和tbody上使用translateY弄乱了z-index(Using translateY on thead and tbody messes up z-index)
    问题 我正在使用transform:将tbody和thead上的translateY放置在大div中。 table thead { transform: translateY(200px); background: green; } table tbody { transform: translateY(190px); background: blue; } 在webkit(Chrome和Safari)中,即使我将z-index添加到两个选择器,tbody也会覆盖thead。 这里举个例子。 thead始终应始终可见,并且tbody的背景中应具有较低的z-index。 为什么有办法解决呢? 回答1 指定transform ,将创建一个新的stacking context 。 您的thead和tbody z-index不再共享公共上下文(这就是为什么tbody高于thead的原因,而不管指定的z-index如何)。 以下是讨论z-index和堆栈上下文的几篇文章: http://philipwalton.com/articles/what-no-one-told-you-about-z-index/ 另一篇带有演示的文章。 http://benfrain.com/z-index-stacking-contexts-experimental-css-and-ios-safari/
  • Java:JSON-> Protobuf和反向转换(Java: JSON -> Protobuf & back conversion)
    问题 我有一个现有系统,该系统在GUI和服务器之间使用基于Protobuf的通信协议。 现在,我想添加一些持久性,但是目前protobuf消息已直接转换为第三方自定义对象。 有没有一种方法可以将原始消息转换为json ,然后可以将其持久化到数据库中。 注意:我不太喜欢将二进制protobuf写入数据库的想法,因为它有一天可能变得无法与较新版本向后兼容并以这种方式破坏系统。 回答1 如对类似问题的回答中所述,自v3.1.0起,这是ProtocolBuffers的受支持功能。 对于Java,请包括扩展模块com.google.protobuf:protobuf-java-util,并使用JsonFormat,如下所示: JsonFormat.parser().ignoringUnknownFields().merge(json, yourObjectBuilder); YourObject value = yourObjectBuilder.build(); 回答2 我们目前正在使用protobuf-java-format将Protobuf消息( Message任何子类)转换为JSON格式,以通过我们的Web API发送。 只需做: JsonFormat.printToString(protoMessage) 回答3 我不太喜欢将二进制protobuf写入数据库的想法
  • 如何在protobuf 3中定义可选字段(How to define an optional field in protobuf 3)
    问题 我需要在 protobuf(proto3 语法)中指定一个带有可选字段的消息。 在 proto 2 语法方面,我想表达的信息是这样的: message Foo { required int32 bar = 1; optional int32 baz = 2; } 根据我的理解,“可选”概念已从语法原型 3 中删除(以及必需的概念)。 尽管尚不清楚替代方案 - 使用默认值来说明尚未从发件人指定字段,但如果默认值属于有效值域(例如考虑布尔类型),则会留下歧义。 那么,我应该如何对上面的消息进行编码? 谢谢你。 回答1 从 protobuf 3.15 版开始,proto3 支持使用optional关键字(就像在 proto2 中一样)来提供标量字段存在信息。 syntax = "proto3"; message Foo { int32 bar = 1; optional int32 baz = 2; } 为上面的optional字段生成了has_baz() / hasBaz()方法,就像在 proto2 中一样。 引擎盖下,protoc有效治疗的optional字段,如果它被使用宣布oneof包装,如Cyber​​Snoopy的回答提示: message Foo { int32 bar = 1; oneof optional_baz { int32 baz = 2; } }
  • 使用 nanopb 在 protobuf 中编译问题(compilation issue in protobuf with nanopb)
    问题 我正在使用 nanopb 库 我寻求您的建议来解决构建问题 - 我正在使用 protobuf 3.12,nanopb 0.4.2, puython3,gcc 。 我编译了 c 和 python 的 protoc,但在构建时仍然遇到问题。 make protoc -osimple.pb simple.proto - step done nanopb/examples/simple $ python ../../generator/nanopb_generator.py simple.pb -> following error $ python3 ../../generator/nanopb_generator.py simple.pb Traceback (most recent call last): File "../../generator/nanopb_generator.py", line 50, in from .proto import nanopb_pb2 SystemError: Parent module '' not loaded, cannot perform relative import During handling of the above exception, another exception occurred: Traceback
  • Unity + Grpc + protobuf + C# 使用流程详解
    最近公司的一个unity项目要把通信方式从Photon替换成grpc,正好系统学一下grpc,以下是我的学习心得。 本篇博客系统详细地介绍了unity使用grpc通信的全部要点,希望可以帮助到大家。奥利给! grpc+protobuf+unity+C# 一、本篇博客知识点简介二、资源及工具的下载地址1、protocolBuffers各个版本2、GRPC3、grpc_unity_package.2.27.0-dev4、.NET Core SDK 2.1及以上 三、C#使用Grpc方法流程1、新建项目2、定义服务3、使用GRPC.Tools自动生成.cs代码4、创建服务端及客户端5、实现grpc通信 四、在Unity中使用Grpc方法1 导入生成的.cs方法2 导入生成的.dll 五、注意事项及报错解决办法 一、本篇博客知识点简介 看了这篇博客能获得以下技术知识; 定义服务使用GRPC.Tools自动代码,把.proto解析成.cs创建服务端及客户端在C#中使用Grpc在Unity中使用Grpc 二、资源及工具的下载地址 1、protocolBuffers各个版本 下载地址:https://github.com/protocolbuffers/protobuf protoBuf版本有很多,项目中的.proto用的哪个版本,就下载哪个版本解析,无要求的话建议下载3.8.x
  • 无法在没有 frameworkAssemblies 的情况下解决程序集引用问题(Unable to resolve assembly reference issue without frameworkAssemblies)
    问题 我正在尝试验证 Protocol Buffers 是否可以与来自 ASP.NET 团队的新的可移植运行时以及理想情况下大多数其他现代环境一起使用。 3.0.0-alpha4 版本是在不久前使用 profile259 创建的,因此我希望在某些情况下需要进行一些更改,但我想我会尝试一下。 我知道 Oren Novotny 的关于定位 .NET Core 的帖子,并且预计必须对 Google.Protobuf nuspec 文件进行一些更改,但我遇到的错误让我难倒。 DNX 版本:1.0.0-rc1-update1 我目前尝试测试的场景是一个针对 dnx451 的控制台应用程序。 我有一个非常简单的示例应用程序: using Google.Protobuf.WellKnownTypes; using System; public class Program { public static void Main(string[] args) { Duration duration = new Duration { Seconds = 100, Nanos = 5555 }; Console.WriteLine(duration); } } ...和一个很小的project.json : { "compilationOptions": { "emitEntryPoint": true }
  • 深入理解 ProtoBuf 原理与工程实践(概述)
    ProtoBuf 作为一种跨平台、语言无关、可扩展的序列化结构数据的方法,已广泛应用于网络数据交换及存储。随着互联网的发展,系统的异构性会愈发突出,跨语言的需求会愈加明显,同时 gRPC 也大有取代Restful之势,而 ProtoBuf 作为g RPC 跨语言、高性能的法宝,我们技术人有必要 深入理解 ProtoBuf 原理,为以后的技术更新和选型打下基础。 我将过去的学习过程以及实践经验,总结成系列文章,与大家一起探讨学习,希望大家能有所收获,当然其中有不正确的地方也欢迎大家批评指正。 本系列文章主要包含: 深入理解 ProtoBuf 原理与工程实践(概述) 深入理解 ProtoBuf 原理与工程实践(编码) 深入理解 ProtoBuf 原理与工程实践(序列化) 深入理解 ProtoBuf 原理与工程实践(工程实践) 一、什么是ProtoBuf ProtoBuf(Protocol Buffers)是一种跨平台、语言无关、可扩展的序列化结构数据的方法,可用于网络数据交换及存储。 在序列化结构化数据的机制中,ProtoBuf是灵活、高效、自动化的,相对常见的XML、JSON,描述同样的信息,ProtoBuf序列化后数据量更小、序列化/反序列化速度更快、更简单。 一旦定义了要处理的数据的数据结构之后,就可以利用ProtoBuf的代码生成工具生成相关的代码。只需使用 Protobuf
  • 安装 Python 包:“当前 win-64 通道中缺少包”(Install Python package: “Package missing in current win-64 channels”)
    问题 我想在 Anaconda 上安装 GSEApy(我使用 64 位 Windows 10)。 https://bioconda.github.io/recipes/gseapy/README.html https://anaconda.org/bioconda/gseapy 但我收到此错误: C:\Windows\system32>conda install gseapy Using Anaconda Cloud api site https:// api.anaconda.org Fetching package metadata ........... Solving package specifications: . Error: Package missing in current win-64 channels: - gseapy You can search for packages on anaconda.org with anaconda search -t conda gseapy 我该如何解决这个问题? 回答1 您需要使用具有 win-64 版本的频道。 用: conda install -c bioninja gseapy 选项-c或--channel允许指定通道。 您还可以通过以下方式永久添加频道: conda config --add channels
  • 使用独立NDK工具链构建协议缓冲区(Building Protocol Buffers with Standalone NDK toolchain)
    问题 我无法使用使用$ NDK / build / tools / make-standalone-toolchain.sh脚本创建的独立NDK工具链为Android构建协议缓冲区。 我遇到的问题是这样的: libtool: link: g++ -Wall -Wwrite-strings -Woverloaded-virtual -Wno-sign-compare -O2 -g -DNDEBUG -o protoc main.o ./.libs/libprotobuf.a ./.libs/libprotoc.a /home/sizeak/AudioFingerprinting/ProtoBuf/jni/src/.libs/libprotobuf.a -lz -lc ./.libs/libprotoc.a(plugin.pb.o): In function `GoogleOnceInit': /home/sizeak/AudioFingerprinting/ProtoBuf/jni/src/./google/protobuf/stubs/once.h:115: undefined reference to `pthread_once' 这似乎意味着缺少pthreads库,但是sysroot是由ndk脚本创建的,因此应该包含所有内容,对吗? 我在某处读到
  • How to pair rows in a data frame with many columns using dplyr in R?
    I have a dataframe containing multiple observations from the control and the experimental cohorts with replicates for each subject. Here is an example of my dataframe: subject cohort replicate val1 val2 A control 1 10 0.1 A control 2 15 0.3 A experim 1 40 0.7 A experim 2 45 0.9 B control 1 5 0.3 B experim 1 30 0.0 C control 1 50 0.5 C experim 1 NA 1.0 I'd like to pair each control observation with its corresponding experimental one for each value to calculate the ratio between the pairs. The desired output would look something like this: subject replicate ratio_val1 ratio_val2 A 1 4 7 A 2 3 3
  • com.google.datastore.v1 和 com.google.cloud.datastore 之间的区别/缺少禁用索引的选项(Difference between com.google.datastore.v1 and com.google.cloud.datastore / Missing option to disable index)
    问题 我目前正在构建一个谷歌云数据流作业,它解析 XML 文件并使用谷歌数据存储保存条目,但不同的 Java 库似乎非常混乱。 首先,我找到了 com.google.datastore.v1,它与 Dataflow 配合得很好,但后来我意识到从索引中排除字段的选项丢失了。 (我的大多数字段不需要索引,永远不会在查询中使用。) 然后我找到了 com.google.cloud.datastore,它有一个名为“setExcludeFromIndexes”的方法来实现我正在寻找的东西,但是 Dataflow 无法保存使用这个库生成的实体。 图书馆之一是较新的图书馆还是有什么区别? 有没有办法使用 v1-library 禁用单个字段的索引? 回答1 v1-library 是一个薄层,提供生成的 proto 源和一些辅助函数。 google-cloud-datastore 是一个使用 v1-library 的包装器,旨在使用户更加友好。 为了允许不同的 Datastore 客户端库与 Dataflow 交互,我们使用 v1 库,因为它是最小公分母。 理想情况下,您将使用 google-cloud-datastore 库,但在这种情况下,v1-library 和 google-cloud-datastore 可能具有相互冲突的依赖项(尤其是 protobuf 3.0.0 v 3.0.0
  • “ make install”的反义词是什么,即如何在Linux中卸载库?(What's the opposite of 'make install', i.e. how do you uninstall a library in Linux?)
    问题 在跑步的时候 ./configure --prefix=/mingw 在我之前运行的库的MinGW / MSYS系统上 './configure --prefix=/mingw && make && make install' 我碰到了此消息: 警告:已经安装了Vamp插件SDK版本。 如果安装新版本而不先删除旧版本,请担心。 (续) 这让我担心。 “ make install”的反义词是什么,即,如何在Linux中卸载库? “清洁”会完成这项工作吗,还是有其他步骤涉及? 回答1 make clean从源代码/构建树中删除所有中间文件或输出文件。 但是,它仅影响源代码/构建树。 它不会接触文件系统的其余部分,因此不会删除以前安装的软件。 如果幸运的话,可以运行make uninstall 。 但是,这取决于图书馆的作者。 有些作者提供了uninstall目标,而另一些则没有。 如果您不走运,则必须手动将其卸载。 运行make -n install可能会有所帮助,因为它将显示该软件自行安装但实际上不会执行任何操作的步骤。 然后,您可以手动撤消这些步骤。 回答2 如果sudo make uninstall不可用: 在基于Debian的系统中,您可以运行sudo checkinstall来制作一个.deb文件,该文件会自动安装,而不是(或在*之后)进行make install 。
  • 导入错误:没有名为 google.protobuf 的模块(ImportError: No module named google.protobuf)
    问题 我正在遵循本指南 (https://developers.google.com/protocol-buffers/docs/pythontutorial) 并使用 addressbook.proto 的确切示例。 将编译器生成的 addressbook_pb2.py 文件的内容也贴出来。 当我运行以下简单程序时,出现错误提示,找不到 google.protobuf,任何想法如何解决此问题? 谢谢。 顺便说一句,在 Mac OSX 上使用 Python 2.7。 from addressbook_pb2 import Person p = Person() p.email = "abc" print p.email 这是自动生成的文件addressbook_pb2.py, # Generated by the protocol buffer compiler. DO NOT EDIT! # source: addressbook.proto import sys _b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) from google.protobuf import descriptor as _descriptor from google.protobuf import
  • gRPC快速入门(一)——Protobuf简介
    gRPC快速入门(一)——Protobuf简介 一、Protobuf简介 1、Protobuf简介 Protobuf即Protocol Buffers,是Google公司开发的一种跨语言和平台的序列化数据结构的方式,是一个灵活的、高效的用于序列化数据的协议。与XML和JSON格式相比,protobuf更小、更快、更便捷。protobuf是跨语言的,并且自带一个编译器(protoc),只需要用protoc进行编译,就可以编译成Java、Python、C++、C#、Go等多种语言代码,然后可以直接使用,不需要再写其它代码,自带有解析的代码。只需要将要被序列化的结构化数据定义一次(在.proto文件定义),便可以使用特别生成的源代码(使用protobuf提供的生成工具)轻松的使用不同的数据流完成对结构数据的读写操作。甚至可以更新.proto文件中对数据结构的定义而不会破坏依赖旧格式编译出来的程序。GitHub地址:https://github.com/protocolbuffers/protobuf不同语言源码版本下载地址:https://github.com/protocolbuffers/protobuf/releases/latest 2、Protobuf的优缺点 Protobuf的优点如下:A、性能号,效率高序列化后字节占用空间比XML少3-10倍,序列化的时间效率比XML快20
  • 无法解析方法 addOnCompleteListener(Cannot resolve method addOnCompleteListener)
    问题 我的程序的一部分如下。 我尝试使用firebase。 我对这种方法有很多问题。 subscribeButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.d(TAG, "Subscribing to news topic"); FirebaseMessaging.getInstance().subscribeToTopic("news").addOnCompleteListener(new OnCompleteListener <Void>() { @Override public void onComplete(@NonNull Task<Void> task) { String msg = getString(R.string.msg_subscribed); if (!task.isSuccessful()) { msg = getString(R.string.msg_subscribe_failed); } Log.d(TAG, msg); Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show(); } }); } }); 这是错误: cannot
  • 如何知道字节数组是哪个protobuf消息?(How to know which protobuf message the byte array is?)
    问题 我想使用 protobuf 而不是 Json 在消息队列之间进行通信。 当只有一个 proto 消息时,我知道如何处理它。 假设 proto 文件是: //person.proto syntax = "proto3"; option java_outer_classname = "PersonProto"; message Person { int32 id = 2; string name = 1; string email = 3; } 现在,我可以用下面的方法来处理它: PersonProto.Person person = PersonProto.Person.newBuilder() .setEmail("123@test.com") .setId(1) .setName("name-test") .build(); byte[] bytes = person.toByteArray(); //Transfer from publisher to consumer between message queue. //I can deserialise it, because i know the proto message is Person. PersonProto.Person.parseFrom(bytes); 但是如果有多个 proto 消息怎么办?
  • 如何确定 protobuf 中的消息类型,以便我可以使用该 type.parsefrom(byte[ ])(How to determine message type in protobuf so that I can use that type.parsefrom(byte[ ]))
    问题 我正在尝试将 protobuf 数据从 cpp 端发送到 java 端。 我在 .proto 中定义了多种消息类型 在 Cpp 方面,我对每种消息类型都有枚举,并将其添加到 buf 输出中,如下所示: uint8_t* __temp = (uint8_t*)(buf); *__temp++ = (type) >> 8; *__temp = (type) & 0x00FF; 我如何获得我添加到 buf 的这种“类型”,以便我可以实现类似的目标 MessageType parseFrom(byte[] data); 回答1 目前尚不清楚确切的要求是什么。 但我假设您正在尝试发送不同类型的消息,并且接收方应该能够从接收到的字节中解析出正确的对象。 这可以按以下示例所示完成: message Message1 { required string a = 1; required string b = 2; } message Message2 { required int64 id = 1; required string data = 2; } message WrapperMessage { required int64 commonField = 1; oneof msg { Message1 m1 = 2; Message2 m2 = 3; } } 基本上,始终
  • 在 IBM power8 上从源代码构建 bazel(Building bazel from source on IBM power8)
    问题 我可以访问一台大型 IBM Power8 机器(运行 Ubuntu),并希望在其上构建 Bazel。 但是,当我尝试按照他们的安装说明进行操作时,我得到: me@machine:~/bazel-0.1.5$ ./compile.sh INFO: You can skip this first step by providing a path to the bazel binary as second argument: INFO: ./compile.sh compile /path/to/bazel 🍃 Building Bazel from scratch. Compiling Java stubs for protocol buffers... third_party/protobuf/protoc-linux-x86_32.exe -Isrc/main/protobuf/ --java_out=/tmp/bazel.T9C83cNa/src src/main/protobuf/android_studio_ide_info.proto scripts/bootstrap/buildenv.sh: line 63: third_party/protobuf/protoc-linux-x86_32.exe: cannot execute binary file: Exec