天道酬勤,学无止境

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 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;
}

Error about missing method


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

Error happens wherever deserializing is involved

e.g 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>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • How to implement com.google.protobuf.BlockingRpcChannel for gRPC generated Java code?
    I recently took a proto file representing a gRPC service and generated Java code from it. However, all the interfaces expect a com.google.protobuf.BlockingRpcChannel and I don't have any idea on how to create it. When I look at example, I see people using io.grpc.ManagedChannel but that is because the generated Java code used that type instead. I'm not sure if it's because i'm using a specific version of protobuf or what? public static BlockingInterface newBlockingStub(com.google.protobuf.BlockingRpcChannel channel) { return new BlockingStub(channel); } Here are examples of what i've seen
  • 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
  • Import Protobuf generated classes using Gradle in IntelliJ
    I am having trouble importing Protobuf generated classes using Gradle. This is how my project tree looks like: I've tried marking the packages as Source, I have tried all possible combinations of imports: import generated.main.grpc.GreeterGrpc; import main.java.HelloRequest; import java.*; import HelloRequest; None of them works. Here is my build.gradle: group 'andu' version '1.0-SNAPSHOT' apply plugin: 'java' apply plugin: 'com.google.protobuf' sourceCompatibility = 1.5 repositories { mavenCentral() maven { url "https://plugins.gradle.org/m2/" } } buildscript { repositories { mavenCentral() }
  • 使用独立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脚本创建的,因此应该包含所有内容,对吗? 我在某处读到
  • 使用 gradle 进行简单的 protobuf 编译(simple protobuf compilation with gradle)
    问题 如果您正在寻找示例 gradle protobuf 项目,请看这里。 我在使用 gradle 和 protobuf 时遇到困难,我想创建一个简单的 gradle 项目,该项目将从默认的src/main/proto 、 src/test/proto获取任何 proto 文件并将它们编译为src/main/java 、 src/test/java相应地,然后将其打包到一个 jar 中并发布到本地存储库。 不幸的是,我是 gradle 的新手,无法弄清楚原始项目是如何组成的。 这是我未完成的 build.gradle 文件 apply plugin: 'java' apply plugin: "com.google.protobuf" buildscript { repositories { mavenCentral() } dependencies { classpath 'com.google.protobuf:protobuf-gradle-plugin:0.7.0' } } repositories { mavenCentral() } dependencies { compile 'com.google.protobuf:protobuf-java:3.0.0-beta-1' } sourceSets { main { proto { srcDir 'src/main
  • 无法在没有 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 }
  • 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
  • protocal buffers 官方文档学习
    protocal buffers 官方文档学习 文章目录 protocal buffers 官方文档学习1.What are protocol buffers?2.选择你喜欢的语言3.怎么开始,步骤3.1下载和安装protocal buffer 编译器3.2阅读入门指南3.2.1 开发者指南3.2.1.1 怎么开始?3.2.1.2为什么不使用xml?3.2.1.3介绍一下protobuf3 3.2.2 proto3语言3.2.2.1 定义一个消息类型3.2.2.2 字段值类型3.2.2.3枚举3.2.2.4 使用消息类型3.2.2.5嵌套类型3.2.2.6 更新一个消息时怎么办3.2.2.7 未知的字段3.2.2.8 any 类型3.2.2.9Oneof3.2.2.11定义服务3.2.2.12可选项 3.2.3编码风格指南3.2.3.1标准文件格式3.2.3.2 消息和字段名称3.2.3.4 重复字段3.2.3.5 枚举3.2.3.4 重复字段3.2.3.5 枚举 前言:最近在做一个项目,负责通讯这块。采用技术是netty+protobuf 在安卓端和c#端进行通信。项目快差不多了,做一下沉淀,翻译一下protbuf文档,和自己的项目工程实践。工程实践代码可以看我的另一篇博文,是接着写的。 1.What are protocol buffers? protocal
  • simple protobuf compilation with gradle
    If you're looking for sample gradle protobuf project look here. I'm having hard time with gradle and protobuf, i want to create a simple gradle project that will take any proto files from default src/main/proto, src/test/proto and compile them to src/main/java, src/test/java accordingly, then pack that into a jar and publish to local repo. Unfortunately i'm new to gradle and cant figure out how the original project is composed. Here is my unfinished build.gradle file apply plugin: 'java' apply plugin: "com.google.protobuf" buildscript { repositories { mavenCentral() } dependencies { classpath
  • SpringBoot + GoogleProtobuf
    SpringBoot + GoogleProtobuf 项目地址: protobuf-simple :https://github.com/Cyanss/protobuf-simple 一、环境配置   protobuf-java版本的选择需要对应到C++等其他端的版本以及Maven中protobuf-java版本。这里选择3.4.0版本进行演示及测试。 电脑系统: Windows 10 x64 bit protobuf GitHub: https://github.com/protocolbuffers/protobuf protobuf 源码下载: protobuf-java-3.4.0.zip https://github.com/protocolbuffers/protobuf/releases/download/v3.4.0/protobuf-java-3.4.0.zip protoc 编译器下载: protoc-3.4.0-win32.zip https://github.com/protocolbuffers/protobuf/releases/download/v3.4.0/protoc-3.4.0-win32.zip 注:protoc编译器3.4.0版本只有32位安装包。 protobuf-java 依赖: <dependency> <groupId>com
  • gRPC HelloWorld测试
    一、概述 What's gRPC?gRPC is a modern open source high performance RPC framework that can run in any environment. It can efficiently connect services in and across data centers with pluggable support for load balancing, tracing, health checking and authentication. It is also applicable in last mile of distributed computing to connect devices, mobile applications and browsers to backend services.(gRPC是可以在任何环境中运行的现代的开源高性能RPC框架。它可以通过可插拔的支持来有效地连接数据中心内和跨数据中心的服务,以实现负载平衡,跟踪,运行状况检查和身份验证。它也适用于分布式计算的最后一英里,以将设备,移动应用程序和浏览器连接到后端服务。)我们可以用一句话来概括:A high-performance, open-source universal RPC frameworkRPC(remote
  • Java:如何解析Lambda参数的通用类型?(Java: how to resolve generic type of lambda parameter?)
    问题 好吧,我们有FunctionalInterface : public interface Consumer<T> { void accept(T t); } 我可以像这样使用它: .handle(Integer p -> System.out.println(p * 2)); 我们如何在代码中解析该lambda参数的实际generic type ? 当我们将其用作内联实现时,从该类的方法中提取Integer并不困难。 我想念什么吗? 还是Java不支持lambda类? 为了更清洁: 该lambda被MethodInvoker包装(在提到的handle ),该方法在其execute(Message<?> message)提取实际参数,以供进一步的反射方法调用。 在此之前,它使用Spring的ConversionService将提供的参数转换为目标参数。 在这种情况下,方法handle是实际应用程序工作之前的一些配置程序。 不同的问题,但期望有相同问题的解决方案:Java:使用lambda参数获取通用方法的实际类型 回答1 我最近在TypeTools中添加了对解析lambda类型参数的支持。 前任: MapFunction<String, Integer> fn = str -> Integer.valueOf(str); Class<?>[] typeArgs =
  • Unable to resolve assembly reference issue without frameworkAssemblies
    I'm trying to validate that Protocol Buffers is going to work with the new portable runtimes from the ASP.NET team and ideally most other modern environments. The 3.0.0-alpha4 build was created a while ago using profile259, so I would expect some changes to be required in some cases, but I thought I'd give it a try. I'm aware of Oren Novotny's post about targeting .NET Core, and expected to have to make some changes to the Google.Protobuf nuspec file, but the error I'm running into has me stumped. DNX version: 1.0.0-rc1-update1 The scenario I'm currently trying to test is a console app
  • linux 环境下python3 对google 的 protobuf 安装和使用 详解
    1.安装 a>在线安装 安装protobuf环境: sudo snap install protobuf --classic 安装protobuf python库:pip3 install protobuf b>源码安装 下载源代码 安装protoc 解压:protoc-3.5.0-osx-x86_64.zip 将解压出的:protoc-3.5.0-osx-x86_64/bin/protoc至于系统路径中 输入:protoc --version 检查是否安装成功 安装Python扩展,protobuf 解压:protobuf-python-3.5.0.zip 进入目录:protobuf-3.5.0/python 首先更新:setuptools 和 pip, 执行命令:pip3 install -U setuptools pip 避免出现错误:AttributeError: '_NamespacePath' object has no attribute 'sort' 我的pip和setuptools版本分别是:pip: 10.0.0.dev0,setuptools: 36.7.2 然后依次执行: python3 setup.py build python3 setup.py test python3 setup.py install 检查是否安装成功 Python 3.6.3
  • 深入理解 ProtoBuf 原理与工程实践(概述)
    ProtoBuf 作为一种跨平台、语言无关、可扩展的序列化结构数据的方法,已广泛应用于网络数据交换及存储。随着互联网的发展,系统的异构性会愈发突出,跨语言的需求会愈加明显,同时 gRPC 也大有取代Restful之势,而 ProtoBuf 作为g RPC 跨语言、高性能的法宝,我们技术人有必要 深入理解 ProtoBuf 原理,为以后的技术更新和选型打下基础。 我将过去的学习过程以及实践经验,总结成系列文章,与大家一起探讨学习,希望大家能有所收获,当然其中有不正确的地方也欢迎大家批评指正。 本系列文章主要包含: 深入理解 ProtoBuf 原理与工程实践(概述) 深入理解 ProtoBuf 原理与工程实践(编码) 深入理解 ProtoBuf 原理与工程实践(序列化) 深入理解 ProtoBuf 原理与工程实践(工程实践) 一、什么是ProtoBuf ProtoBuf(Protocol Buffers)是一种跨平台、语言无关、可扩展的序列化结构数据的方法,可用于网络数据交换及存储。 在序列化结构化数据的机制中,ProtoBuf是灵活、高效、自动化的,相对常见的XML、JSON,描述同样的信息,ProtoBuf序列化后数据量更小、序列化/反序列化速度更快、更简单。 一旦定义了要处理的数据的数据结构之后,就可以利用ProtoBuf的代码生成工具生成相关的代码。只需使用 Protobuf
  • Android Studio cannot resolve getDefaultProguardFile
    When I run my program i get no problems. When I try to generate signed apk, I am told that getDefaultProguardFile cannot be resolved. How can I fix this. Here is the code. apply plugin: 'com.android.application' android { compileSdkVersion 21 buildToolsVersion "21.1.2" defaultConfig { applicationId "com.dose.apps.brainnoodles" minSdkVersion 8 targetSdkVersion 21 versionCode 13 versionName "2.13" } buildTypes { release { //apply plugin: 'idea' minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { compile fileTree(dir: 'libs'
  • gRPC远程实现Java调用python服务-demo
    GRPC学习 1 GRPC配合java的简单应用 1.1 项目生成 用IDEA生成的一个Springboot应用。(这边是因为要做一个web项目,也可以只生成一个普通的带maven的java项目)。先放出一个整体的项目结构图,这个结构图的一些文件是整个项目编译(target文件夹中的文件)好才生成的。 1.2 添加依赖 首先是添加一下grpc对应的依赖。 <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-netty-shaded</artifactId> <version>1.26.0</version> </dependency> <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-protobuf</artifactId> <version>1.26.0</version> </dependency> <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-stub</artifactId> <version>1.26.0</version> </dependency> 除了以上方法,还可以像如下的方式添加全面的依赖,但是导入的依赖项比较多。 <dependency> <groupId>io
  • 如何在单个命令中编译多个原型文件?(How to compile multiple proto files in single command?)
    问题 我在单个目录中有两个原型文件,我正在寻找一种方法,可以在一个命令中从这些文件生成类。 看来这可以通过--proto_path参数来完成。 根据文档: 您必须提供一个或多个.proto文件作为输入。 可以一次指定多个.proto文件。 尽管这些文件是相对于当前目录命名的,但是每个文件都必须驻留在IMPORT_PATH之一(由--proto_path参数指定)中,以便编译器可以确定其规范名称。 C:\shekhar\proto_trial>dir Volume in drive C is C Directory of C:\shekhar\proto_trial 07/25/2014 12:16 PM <DIR> . 07/25/2014 12:16 PM <DIR> .. 07/25/2014 12:16 PM <DIR> java_op 07/25/2014 12:16 PM 230 map.proto 07/23/2014 04:24 PM 161 message.proto 07/25/2014 12:17 PM 1,228 response.proto 3 File(s) 1,619 bytes 3 Dir(s) 50,259,398,656 bytes free 我使用了--proto_path参数,如下所示 C:\shekhar\proto_trial>protoc
  • compile.sh - The system is out of resources
    I am trying to compile bazel from source on my NVIDIA Jetson TK1. When trying to run compile.sh I get the following error: ubuntu@tegra-ubuntu:~/bazelArtefact/bazel-0.14.1-dist$ ./compile.sh 🍃 Building Bazel from scratch../usr/lib/jvm/java-8-oracle/bin/javac -classpath third_party/asm/asm-analysis-6.0.jar:third_party/asm/asm-6.0-sources.jar:third_party/asm/asm-tree-6.0-sources.jar:third_party/asm/asm-commons-6.0.jar:third_party/asm/asm-6.0.jar:third_party/asm/asm-commons-6.0-sources.jar:third_party/asm/asm-util-6.0.jar:third_party/asm/asm-util-6.0-sources.jar:third_party/asm/asm-analysis-6.0
  • Android中的ProtoBuf应用-基础篇
    项目中经常用到Gson,xml等数据格式,今天接触到一个新的(对我来说是新的)格式,决定尝试一下其在Android中的用法,折腾了半天,终于搞完了,在此总结一下基本用法。 ProtoBuf的优势: 跨平台,跨语言。你可以在Android,Linux,Windows多个平台使用它并且不受Java,Python还是C++的限制数据量小。由于其独特的序列化方式,使得其比其他数据格式更小,传输效率更高。扩展性好,兼容性好。在更新数据结构后,基于其特有的Builder方式,可以不对原有的代码产生影响。 搭建环境 在Android Studio中搭建环境并没有想象中的轻松,历经了多种方式,辗转多个教程才最终运行成功,主要有以下几个步骤: 1.在项目的build.gradle中添加依赖 dependencies { classpath 'com.android.tools.build:gradle:3.4.1' classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.10' } 2.在app的build.gradle中添加插件 apply plugin: 'com.google.protobuf' 3.在app的build.gradle的android目录下添加sourceSets sourceSets { main { java {