我尝试在 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 客户端中工作的呢?