[protocolbuffers/protobuf]两个原始消息之间的双向映射/转换

2024-05-11 991 views
9

这适用于什么语言? 添加了 proto 语法(可以适用于 proto2 或 proto3,但对于 proto2 更好)。

描述您正在尝试解决的问题。

我正在尝试采用跨平台的方式来自动执行两个原始消息之间的转换。对于重构、API 更改等非常有用。当您想要在不破坏现有 API 的情况下创建更好的原型消息时。

描述您想要的解决方案

使用原始注释(如protoc-gen-validate)在旧字段到新字段之间映射(使用完整字段路径,可能启用一些通用转换方法,如 int->string 或 string->enum 等)

每种语言都需要单独实现其用法。

描述您考虑过的替代方案

单独为每种语言创建转换。我发现有一些库可以为 Java 执行此操作。但这不是跨语言的,并且不适用于使用其他语言的 API 客户端。

额外的背景信息

要求:

  1. 这两个消息可以具有完全不同的结构(例如,子消息、字段重命名、不同的枚举类型)
  2. 我希望为所有语言自动创建转换(例如,通过构建规则)。如果不可能,则必须同时支持 Java 和 C++。

示例: A 和 B 之间的转换:

message A {
  optional string name = 1;
  optional Enum type = 2;
  enum Enum {
    TYPE1 = 1,
    TYPE2 = 2,
  }
}

message B {
  message Metadata {
      optional string name = 1;
  }
  optional Metadata metadata = 1;

  message SemanticData {
      optional SimilarEnum type = 1;
      enum SimilarEnum {
        TYPE_RENAMED1 = 1,
        TYPE_RENAMED_REVALUED2 = 5,
      }
  }
  optional SemanticData value = 2;  
}

回答

7

这将成为一个很好的第三方实用程序。看起来这并不需要成为核心。

9

有没有办法作为第三方实用程序建议/请求类似的东西?

5

我怀疑核心团队现在是否有资源来优先考虑或创建这样的事情。然而,任何有兴趣的人都可以这样做。并非所有好主意都需要在此存储库中完成。

8

虽然原型团队现在无法直接支持这项工作,但我将重新打开该问题并用所需的帮助标记它,以保留这个想法,并希望从贡献者那里获得一些实施帮助。

3

如果实现的话,这属于这个仓库还是一个单独的项目?也就是说,它需要位于核心吗?

4

你好,@Your-Eye,我有一个与你上面所说的类似的要求。想知道您是如何实现这一目标的吗?谢谢。

7

你好,@Your-Eye,我有一个与你上面所说的类似的要求。想知道您是如何实现这一目标的吗?谢谢。

不幸的是,我没有。这个问题仍然悬而未决。目前,我熟悉的唯一解决方案是特定语言的解决方案,而不是 protobuf 级别的解决方案。

在我工作的地方,我们有一个@AutoConverterfor Java(例如@AutoValue)可以根据字段名称自动转换消息。但我不认为它是外部可用的。

9

@Your-Eye Hi..如果您知道任何特定于 C++ 的实用程序,请告诉我。不管怎样,感谢您的回复。谢谢 !!

0

我认为这在 protobuf 核心之外更好。如果我要设计这样的东西,我可能会使用自定义选项来定义接口,然后发布每种语言必须如何解释这些选项的规范。然后,您可以使用代码生成器插件或反射在每种语言的基础上处理它们。

1

@fowles 那么请求这个的正确位置是什么?如何保留这个想法,以便第三方可以按照 @deannagarcia 的建议来实现?

3

我不知道是否存在人们希望存在的开源软件项目想法的良好交流中心。