【问题标题】:Protocol Buffer Java, serialize an enum that has fieldsProtocol Buffer Java,序列化具有字段的枚举
【发布时间】:2015-08-23 16:29:52
【问题描述】:

假设我在 Java 中定义了以下枚举:

public enum DogBreed {
  GERMAN_SHEPHERD,
  FRENCH_BULLDOG,
  ...
}

public enum Dog {
  MAX(DogBreed.GERMAN_SHEPHERD),
  SCOOTER(DogBreed.FRENCH_BULLDOG),
  ...

  private final DogBreed breed;
}

在 proto 文件中描述 DogBreed 很简单,但是我找不到描述 Dog 枚举的方法。

【问题讨论】:

  • @bobbel:原始发帖人似乎完全知道如何创建枚举类,但是您的链接与他的主要问题有何关系——将嵌套枚举表示为 proto 文件?我想你可能没有完全理解他的问题。
  • 好吧,我认为“描述”只是在这种情况下“写作”的另一个词。所以,请向我解释一下,“描述”这个枚举是什么意思,“原始文件”是什么意思?也许您可以为这个问题提供更多背景信息。
  • 看起来这个答案可能是我正在寻找的:stackoverflow.com/questions/28961605/…。如果它确实解决了我的问题,我会试一试并写一个答案
  • 我明白了……我以前不知道协议缓冲区……但这是一件有趣的事情。抱歉我的愚蠢回答,这对您没有任何帮助......但是,如果您对此有解决方案,请将其写在这里作为答案。

标签: java enums protocol-buffers


【解决方案1】:

借助我在 cmets 中链接的答案,我能够编写以下 proto 文件:

import "google/protobuf/descriptor.proto";

extend google.protobuf.EnumValueOptions {
  DogMessage.DogBreed dogBreed = 51234;
}

message DogMessage {
  enum DogBreed {
    GERMAN_SHEPHERD = 0;
    FRENCH_BULLDOG  = 1;
  }

  enum  Dog {
    MAX     = 0 [(dogBreed) = GERMAN_SHEPHERD];
    SCOOTER = 1 [(dogBreed) = FRENCH_BULLDOG];
  }
}

然后可以在客户端使用getValueDescriptor.getOptions() 访问dogBreed 的值

但我最终意识到我实际上并不需要它。我试图完全复制我的数据模型类。那是因为我来自 Jackson 的 JSON 序列化世界,在那里您可以准确地发送和接收数据模型类。
但是由于 protobuf 使用了一个中间表示类,我不妨写如下:

message DogMessage {
  string dogName  = 0;
  string dogBreed = 1;
}

我将能够根据另一侧的字符串值重建我的数据模型枚举。

感谢您对此进行调查

编辑:进一步实现:Dog 枚举由什么组成并不重要。只要我转移它的一个值(MAX,SCOOTER),我就可以根据这个单一值完全重建枚举。

【讨论】:

    猜你喜欢
    • 2014-08-10
    • 2013-08-24
    • 2021-12-22
    • 1970-01-01
    • 2013-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多