当前位置: 首页 > 知识库问答 >
问题:

将复杂Java类建模为协议缓冲区

牟辰龙
2023-03-14

在协议缓冲区(.proto)中表示这一点的最佳方式是什么?

public class EntityId {
  private String type;
  private String id;  
}

public class EntityBlob {
  private String blobName;
  private byte[] blobBytes; 
}

public class Entity {
  private String dir;
  private String entityType;
  private String entityId;
  private Set<EntityBlob> blobs; 
  private Map<String,EntityProperty> properties;
  private Multimap<String, EntityId> relatedEntities;
}

public abstract class EntityProperty<T> {
  // ...
}

// Example concrete EntityProperty:
public class EntityStringProperty extends EntityProperty<String> {
  public EntityStringProperty(String value) {
    super(value);
  }
}

其中,字段属性只能接受以下内容,EntityStringProperty、EntityBooleanProperty、EntityDoubleProperty等。

有一些特殊的课程:

public class EntityArrayProperty extends EntityProperty<List<EntityProperty>> {
  public EntityArrayProperty(List<EntityProperty> value) {
    super(value);
  }
}

public class EntityObjectProperty extends EntityProperty<Map<String, EntityProperty>> {
  public EntityObjectProperty(Map<String, EntityProperty> value) {
    super(value);
  }
}

如何使用协议缓冲区对这个复杂的类进行建模?特别是Map


共有1个答案

夏侯航
2023-03-14

Map属性还不错:protobuf支持Map。对于属性类型,将使用一条消息包装其中一个。所以会发生类似的事情

message Entity {
  string dir = 1; 
  string entity_type = 2;
  string entity_id = 3;
  repeated EntityBlob blobs = 4;
  map<string, EntityProperty> properties = 5;
  map<string, EntityIdList> related_entities = 6;
}
message EntityProperty {
  oneof property_value {
    string string_value = 1;
    EntityArrayProperty array_value = 2;
    EntityObjectProperty object_value = 3;
    bool bool_value = 4;
    double double_value = 5;
  }
}
message EntityArrayProperty {
  repeated EntityProperty values = 1;
}
message EntityObjectProperty {
  map<string, EntityProperty> property_map = 1;
}
message EntityIdList {
  repeated EntityId ids = 1;
}
message EntityBlob {
  string blob_name = 1;
  bytes blob_bytes = 2;
}
message EntityId {
  string type = 1;
  string id = 2;
}

或者,它看起来像是实体属性(EntityProperty)可能等同于谷歌(google)。protobuf。值,因此您可能不必自己编写,但可以使用预定义的消息类型。

 类似资料:
  • 是否有一个工具或库可以将PROBUFF对象映射到POJO。我想让pojo实现我无法使用PROBUFF对象实现的其他接口。或者我必须手动执行此转换?

  • 试图使用Ionic 4中的协议缓冲区进行编码 我已经下载了协议并用它来生成一堆_pb.js文件,每个. proto文件一个。很好。 首先关注原型示例。这是示例代码: 我做了一些更改以匹配我的文件。更改proto文件的名称。但是我的proto文件中没有包名称。所以我只是使用了消息名称。首先这是我的. proto文件的开头: 下面是我修改后的代码: 这似乎不起作用。我的控制台显示: 我相信我已经成功地

  • 问题内容: 我正在使用gSoap将旧式C 系统重构为SOA。我们遇到了一些性能问题(非常大的XML),因此我的领导要我看一下协议缓冲区。我做到了,它看起来非常酷(我们需要C 和Java支持)。但是协议缓冲区是仅用于序列化的解决方案,现在我需要将其发送到Java前端。从C ++和Java角度来看,我应该使用什么来通过HTTP(只是内部网络)发送那些序列化的内容? PS。另一个人试图加速我们的gSoa

  • 而不是使用关系。关系GetRequest作为请求和响应。有什么方法可以将请求/响应转换为POJO? 我见过这个解决方案,但它比我想要的要复杂一些:将协议缓冲区转换为POJO 我正在使用翻新和谷歌协议缓冲区。 我所拥有的: 我想用的是: 关系: 我的请求最终是这样的,请求必须在这里构建...

  • 据我所知,协议缓冲区主要用于控制服务器和客户端代码的项目。我的一般问题是——协议缓冲区能否用于将二进制消息序列化/反序列化到使用现有协议的服务器?所以,我的问题: > 如果协议缓冲区不支持本机微调现有协议的序列化/反序列化方式,那么可以通过扩展添加该功能吗?是否可以以某种方式添加序列化/反序列化方法可以识别的关键字?也许这可以通过扩展或修改protobuf csharp port或protobuf

  • 在阅读这个相当长的问题之前,我提出了一个bughttps://github.com/GoogleCloudPlatform/python-docs-samples/issues/1103. 原型包和名称解析的留档状态 您可以使用其他定义。通过导入原始文件。导入另一个。在proto的定义中,您可以在文件的顶部添加一条import语句。 我的依赖于annotations.proto将HTTP/JSON