我正在探索协议缓冲区的使用,并希望使用protobuf3中的新时间戳数据类型。这是我的.proto文件:
syntax = "proto3";
package shoppingbasket;
import "google/protobuf/timestamp.proto";
message TransactionItem {
optional string product = 1;
optional int32 quantity = 2;
optional double price = 3;
optional double discount = 4;
}
message Basket {
optional string basket = 1;
optional google.protobuf.Timestamp tstamp = 2;
optional string customer = 3;
optional string store = 4;
optional string channel = 5;
repeated TransactionItem transactionItems = 6;
}
message Baskets {
repeated Basket baskets = 1;
}
在从这个.proto文件生成python类之后,我尝试使用生成的类创建一些对象。下面是代码:
import shoppingbasket_pb2
from google.protobuf.timestamp_pb2 import Timestamp
baskets = shoppingbasket_pb2.Baskets()
basket1 = baskets.baskets.add()
basket1.basket = "001"
basket1.tstamp = Timestamp().GetCurrentTime()
由于错误而失败:
AttributeError:不允许在协议消息对象中组合字段"tstamp“的赋值。
有人能向我解释一下为什么这不管用吗?因为我没有工作。
发布于 2020-12-04 05:42:16
发布于 2022-03-26 21:30:31
您还可以解析它:
Timestamp().FromJsonString("2022-03-26T22:23:34Z")
发布于 2022-09-01 15:21:09
我发现这非常令人困惑,因为它与我的演示中分配其他值的方式不同,所以我想使用.FromDatetime()
添加这个方法
.proto:
message User {
int64 id = 1;
string first_name = 2;
...
string phone_number = 7;
google.protobuf.Timestamp created_on = 8; # <-- NB
}
响应UserMsgs.User()
在这里是一个从上面的原型文件生成的类,并且知道每个字段的类型。
def GetUser(self, request, context):
response = UserMsgs.User()
if request.id is not None and request.id > 0:
usr = User.get_by_id(request.id)
response.id = usr.id
response.first_name = usr.first_name
...
response.phone_number = str(usr.phone_number)
response.created_on.FromDatetime(usr.created_on) # <-- NB
return response
因此,我们可以使用前面提到的内置函数response.created_on,而不是将=
作为其他函数分配给这里。注意:注意日期时间的小写t。
在我的示例中,usr.created_on
是python,它被分配给一个google.protobuf.Timestamp字段。
https://stackoverflow.com/questions/65135205
复制相似问题