【问题标题】:Generate google wrapper class for proto definition (pulsar native protobuf)为 proto 定义生成 google 包装类(pulsar native protobuf)
【发布时间】:2021-03-23 20:46:50
【问题描述】:

我尝试在 dotnet 客户端中实现此 PR https://github.com/apache/pulsar/pull/8372。据我目前所知,为输入类生成消息模式的工作方式如下: 某些类 -> 此类的 .proto -> 来自此 .proto 的 google 包装器 -> 从包装器中获取 Descriptor 并继续进行序列化。

在集成测试中有一个例子可以做到这一点:

 ProtobufNativeSchema<org.apache.pulsar.client.schema.proto.Test.TestMessage> protobufSchema

 = ProtobufNativeSchema.of(org.apache.pulsar.client.schema.proto.Test.TestMessage.class)

TestMessage 是一个 .proto 定义:

syntax = "proto3";
package proto;

import "ExternalTest.proto";

option java_package = "org.apache.pulsar.client.schema.proto";
option java_outer_classname = "Test";

enum TestEnum {
    SHARED = 0;
    FAILOVER = 1;
}

message SubMessage {
    string foo = 1;
    double bar = 2;
    message NestedMessage {
        string url = 1;
        string title = 2;
        repeated string snippets = 3;
    }
}

message TestMessage {
    string stringField = 1;
    double doubleField = 2;
    int32 intField = 6;
    TestEnum testEnum = 4;
    SubMessage nestedField = 5;
    repeated string repeatedField = 10;
    proto.external.ExternalMessage externalMessage = 11;
}

我无法理解 .proto 是如何转换为 java 类的。有一个 proto 编译器 https://developers.google.com/protocol-buffers/docs/reference/java-generated 可以从 .proto 创建 java 类;但它需要手动调用,然后才能将类包含在代码库中并使用。看起来它在集成测试示例中“即时”运行,至少我无法在任何地方找到生成的类。

Reference for C# https://developers.google.com/protocol-buffers/docs/reference/csharp-generated 做同样的事情,但会生成 C# 源文件。

那么它在java客户端中究竟是如何工作的呢?

【问题讨论】:

  • 标签应该是“apache-pulsar”:)

标签: java schema protocol-buffers native pulsar


【解决方案1】:

事实证明,用于生成模式的输入类应该是 GeneratedMessageV3 类型。因此,它已经被 protobuf 预编译,并且代码库相关部分中的所有类型都通过 java 反射“约束”到它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    • 1970-01-01
    • 2022-10-06
    • 2018-08-01
    • 2021-12-30
    相关资源
    最近更新 更多