在其他proto文件中导入date.proto

问题描述 投票:0回答:3

我是协议缓冲区的新手。我有一些 java pojo 类,它有一个 Date 类型的字段,仅包括年、月和日。

对于时间戳类型,我们可以

import "google/protobuf/timestamp.proto";

但是对于 Date 类型,我们不能这样做,因为 date.proto 位于

https://github.com/googleapis/googleapis/blob/master/google/type/date.proto
中。

那么我该如何导入这个

date.proto

java protocol-buffers
3个回答
3
投票

对于时间戳类型,我们可以导入“google/protobuf/timestamp.proto”;。

因为

timestamp.proto
是Protobuf中包含的一些内置消息类型。

但是对于 Date 类型,我们不能这样做,因为 date.proto 位于 https://github.com/googleapis/googleapis/blob/master/google/type/date.proto

  1. 首先,您应该克隆整个项目或简单地下载您需要的任何
    proto
    文件(在本例中为
    date.proto
    文件)。
  2. 其次,将
    date.proto
    放入你的项目中,你可以创建一个目录用于导入,例如:
    google/type/date.proto
  3. 最后用
    protoc
    生成代码;您必须使用
    --proto_path
    命令行标志(又名
    -I
    )来告诉
    protoc
    在哪里查找
    .proto
    文件。如果您不提供路径,默认情况下它只会搜索当前目录:
protoc -I.  --cpp_out=. usersvr.proto

这是我的演示项目的结构:

╰─$ tree                                                                                
.
├── google
│   └── type
│       └── date.proto
├── usersvr.pb.cc
├── usersvr.pb.h
└── usersvr.proto

usersvr.proto:

syntax = "proto3";
package srv.user;
import "google/protobuf/timestamp.proto";
import "google/type/date.proto";

option cc_generic_services = true;
message BatchGetUserInfosRequest {
  uint64 my_uid = 1;
  repeated uint64 peer_uids = 2;
  map<string, string> infos = 3;
  google.protobuf.Timestamp timestamp = 4;
  google.type.Date date = 5;
}

date.proto
是从https://github.com/googleapis/googleapis/blob/master/google/type/date.proto

下载的

0
投票

假设您的 Gradle(或 Maven)设置正常工作并生成代码,您必须将 .proto 文件复制到 protobuf 源文件中(例如:

project/src/main/proto
)。你只需要复制这个(如果你只关心在 Java 中使用它):

syntax = "proto3";

package google.type;

option java_multiple_files = true;
option java_outer_classname = "DateProto";
option java_package = "com.google.type";

message Date {
  int32 year = 1;
  int32 month = 2;
  int32 day = 3;
}

然后,您将使用 Gradle 任务(或 Maven)生成 Java 代码,并且您将可以通过像这样导入来访问

Date

import com.google.type.Date;

之后,建议将

com.google.type.Date
的属性映射到您用作日期的任何类型,最好不要直接存储
com.google.type.Date
生成的类型。这将使您对类型有更多的控制,而如果您存储生成的类型,则无法拥有与 Java 对象相同的自由度。

注意:如果你愿意直接与

Timestamp
合作,有办法将它们转变为
Date


0
投票

一些 Google 时间/日期原型位于单独的库中(与 google/protobuf 不同),因此您需要添加新的依赖项。如果使用Maven,依赖如下:

<dependency>
    <groupId>com.google.api.grpc</groupId>
    <artifactId>proto-google-common-protos</artifactId>
    <version>2.22.0</version>
</dependency>

如果添加依赖项,则不必将原始文件复制粘贴到项目中(正如其他评论中所建议的那样)。

您需要做的就是将导入添加到您的原型文件中(原型文件名以其文件夹路径为前缀)。 例如:如果你想使用 timeOfDay.proto 文件,你需要添加以下导入:

import "google/type/timeofday.proto";

该库包含以下原型文件:

© www.soinside.com 2019 - 2024. All rights reserved.