Android中使用Protocol Buffers

Protocol Buffers

就懒得介绍了,直接使用官网的介绍

协议缓冲区是Google的与语言无关,与平台无关,可扩展的机制,用于对结构化数据进行序列化–以XML为例,但更小,更快,更简单。 您定义要一次构造数据的方式,然后可以使用生成的特殊源代码轻松地使用各种语言在各种数据流中写入和读取结构化数据。

链接: Protocol Buffers使用,参考官网语法.

Android studio中配置Protocol Buffers

这个很简单,直接参考Google官方的介绍
链接:Googe官方在github上的插件介绍,会一一介绍Protocol Buffers使用.

1. 在Project的build.gradle中配置

project build.gradle的配置

2. 在app module或者其他module中配置

2.1. 首先引入插件

apply plugin: 'com.google.protobuf'

2.2. 在android{}中配置

这只是其中一种配置,直接参考链接:Googe官方在github上的插件介绍,会一一介绍Protocol Buffers使用.

protobuf {
        protoc {
            artifact = 'com.google.protobuf:protoc:3.8.0'
        }
        generateProtoTasks {
            all().each { task ->
                task.builtins {
                    java {
                        option "lite"
                    }
                }
            }
        }
    }

2.3. 引入Protocol Buffers的库

implementation 'com.google.protobuf:protobuf-javalite:3.15.6'

Protocol Buffers使用

首先将项目预览视图切换到Project,然后在src/main的Java同级目录中新建目录proto,
然后就可以在proto目录中编写Protocol Buffers的文件,文件以为.proto结尾
在这里插入图片描述
然后Android Studio也会自动提醒你安装预览插件和编辑插件,直接同意安装就行了,然后
就可以看到页面不是一片灰色了,而是跟代码编辑页面类似,有的关键字也会变色,哈哈

如下是我测试写的,使用参考Protocol Buffers的官网,介绍的很详细,英文不好就掏出我们的
翻译软件,嘿嘿
链接: Protocol Buffers使用,参考官网语法.

syntax = "proto3";

option java_package = "com.dh.verifyproject";
option java_outer_classname = "TestProto";

message UserRequest {
  string username = 1;
  string password = 2;
  int32 age = 3;

  enum Corpus {
    UNIVERSAL = 0;
    WEB = 1;
    IMAGES = 2;
    LOCAL = 3;
    NEWS = 4;
    PRODUCTS = 5;
    VIDEO = 6;
  }

  Corpus corpus = 4;
}

message UserResponse {
  int32 errCode = 1;
  string errMsg = 2;
  UserRequest userRequest = 4;

  enum EnumAllowingAlias {
    // 添加这个属性为true,枚举可以设置相同的值
    option allow_alias = true;
    UNKNOWN = 0;
    START = 1;
    // 从生成的代码中我们可以看到, RUNNING = START
    RUNNING = 1;
  }

  EnumAllowingAlias alias = 3;

  enum Foo {
    TEST = 0;
    // reserved标记的都是不能使用的,防止enum中已经不能使用的值
    // 只是被修改名字,但是值还是一样的引起其他问题
    reserved 2, 15, 9 to 11, 40 to max;
    reserved "FOO", "BAR";
  }
}

message SearchRequest {
  message SearchResult {
    string url = 1;
    string title = 2;
    repeated string snippets = 3;
  }

  repeated SearchResult result = 1;
}

message OtherSearchRequest {
  // 使用另外一个message中的内部Message
  SearchRequest.SearchResult result = 1;
}

// 使用Any任意类型
import "google/protobuf/any.proto";
message ErrorStatus {
  string message = 1;
  repeated google.protobuf.Any details = 2;
  google.protobuf.Any anyData = 3;
}

message OneOfMessage {

  // oneof修饰的属性,后设置的值会覆盖前一次的值,只会有一个值存在
  oneof TestOneOf {
    string name = 1;
    int32 age = 2;
  }
}

就是如下这么使用就好了,不熟悉的时候可以在用到的时候再去官网巩固学习下具体的语法

private void testProto() {
        TestProto.UserRequest userRequest = TestProto.UserRequest.newBuilder()
                .setUsername("张三")
                .setPassword("123456")
                .setAge(50)
                .setCorpus(TestProto.UserRequest.Corpus.WEB)
                .build();
        byte[] bytes = userRequest.toByteArray();
        Log.e(TAG, "转换为byte数组:: " + Arrays.toString(bytes));

        try {
            StringBuilder builder = new StringBuilder();
            TestProto.UserRequest parseUserRequest = TestProto.UserRequest.parseFrom(bytes);
            builder.append(parseUserRequest.getUsername())
                    .append("  ")
                    .append(parseUserRequest.getPassword())
                    .append("  ")
                    .append(parseUserRequest.getAge())
                    .append("  ")
                    .append(parseUserRequest.getCorpus());
            Log.e(TAG, "转换为string:: " + builder.toString());
        } catch (InvalidProtocolBufferException e) {
            e.printStackTrace();
        }
    }

private void testProto1() {
        TestProto.UserResponse userResponse = TestProto.UserResponse.newBuilder()
                .setErrCode(0)
                .setErrMsg("登录失败")
                .build();
        byte[] bytes = userResponse.toByteArray();
        Log.e(TAG, "转换为byte数组:: " + Arrays.toString(bytes));

        try {
            TestProto.UserResponse parseResponse = TestProto.UserResponse.parseFrom(bytes);
            String str = parseResponse.getErrCode() + "--->"
                    + parseResponse.getErrMsg();
            Log.e(TAG, "转换为string:: " + str);
        } catch (InvalidProtocolBufferException e) {
            e.printStackTrace();
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Android 使用 gRPC,您需要进行以下步骤: 1. 在您的 Android 项目添加 gRPC 和 protobuf 的依赖项。您可以在项目的 build.gradle 文件添加以下代码: ``` implementation 'io.grpc:grpc-okhttp:1.40.1' implementation 'io.grpc:grpc-protobuf-lite:1.40.1' implementation 'io.grpc:grpc-stub:1.40.1' implementation 'com.google.protobuf:protobuf-java:3.18.0' ``` 2. 定义您的 gRPC 服务和消息类型的.proto 文件。您可以使用 Protocol Buffers 语言来定义它们。例如,创建一个名为 "example.proto" 的文件,并在其定义服务和消息类型。 示例 "example.proto" 文件内容: ```protobuf syntax = "proto3"; package com.example.grpc; service ExampleService { rpc ExampleMethod (ExampleRequest) returns (ExampleResponse) {} } message ExampleRequest { string message = 1; } message ExampleResponse { string reply = 1; } ``` 3. 在您的项目运行 Protocol Buffers 编译器,以生成 Java 类。您可以使用 `protoc` 命令行工具或 Gradle 插件来完成此操作。例如,使用 Gradle 插件可以在项目的 build.gradle 文件添加以下代码: ``` protobuf { protoc { artifact = 'com.google.protobuf:protoc:3.18.0' } plugins { grpc { artifact = 'io.grpc:protoc-gen-grpc-java:1.40.1' } } generateProtoTasks { all()*.plugins { grpc {} } } } ``` 然后,在命令行运行 `./gradlew generateProto` 命令,以生成 Java 类。 4. 创建 gRPC 客户端代码。您可以使用生成的 Java 类来创建客户端代码,并与 gRPC 服务进行通信。在您的 Android 项目,您可以创建一个 gRPC 客户端类,以处理与服务器的通信。 示例 gRPC 客户端类: ```java import com.example.grpc.ExampleRequest; import com.example.grpc.ExampleResponse; import com.example.grpc.ExampleServiceGrpc; import io.grpc.ManagedChannel; import io.grpc.ManagedChannelBuilder; import io.grpc.stub.StreamObserver; public class GrpcClient { private final ManagedChannel channel; private final ExampleServiceGrpc.ExampleServiceStub stub; public GrpcClient(String host, int port) { channel = ManagedChannelBuilder.forAddress(host, port) .usePlaintext() .build(); stub = ExampleServiceGrpc.newStub(channel); } public void callExampleMethod(String message, StreamObserver<ExampleResponse> responseObserver) { ExampleRequest request = ExampleRequest.newBuilder() .setMessage(message) .build(); stub.exampleMethod(request, responseObserver); } public void shutdown() throws InterruptedException { channel.shutdown().awaitTermination(5, TimeUnit.SECONDS); } } ``` 这是一个简单的示例,演示了如何创建 gRPC 客户端并调用服务的方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吃骨头不吐股骨头皮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值