1

我尝试在 dotnet 客户端中实现此 PR https://github.com/apache/pulsar/pull/8372 。据我目前所知,为输入类生成消息模式的工作方式如下:Some class -> .proto for this class -> google wrapper from this .proto -> get Descriptor from the wrapper 并继续进行序列化。

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

 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 类;但它需要手动调用,然后才能将类包含在代码库中并使用。看起来它在集成测试示例中“即时”运行,至少我无法在任何地方找到生成的类。

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

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

4

1 回答 1

0

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

于 2021-03-22T05:06:49.187 回答