解码时间戳记与原始DateTime值不同

时间:2018-07-10 18:12:58

标签: node.js protocol-buffers protobuf-net protobuf.js

我们有一个.NET应用程序,它在模式中定义了adventure.bak,如下所示:

DateTime

应用程序能够使用[ProtoMember(20)]public DateTime? Birthdate; 序列化数据,然后在反序列化之后,可以按预期准确地检索日期。

我现在正尝试使用protobuf-net在我们的node.js应用程序中反序列化相同的缓冲区。我已经在protobuf.js文件中定义了该数据点,如下所示:

.proto

解码后,其出生日期与原始数据不同。例如,当日期最初为10/10/1976时,反序列化日期为:

google.protobuf.Timestamp Birthdate = 20;

从该"Birthdate": { "seconds": "4948" } 创建JavaScript Date时,结果为1970年1月1日。怎么了?

1 个答案:

答案 0 :(得分:1)

这归结为历史。在共享库中存在明确定义的DateTime之前,protobuf-net一直Timestamp支持了很长一段时间。因此:它发明了一种允许protobuf-net与自身之间往返的东西。多年以后,Timestamp出现了,并且...简单地说,它使用了不同的存储布局。好消息是:protobuf-net可以说方言,但是因为我们无法破解现有代码,所以它是“选择加入”。

如果您use a Timestamp in a .proto,您会看到protobuf-net为该.proto生成:

[global::ProtoBuf.ProtoMember(20, DataFormat = global::ProtoBuf.DataFormat.WellKnown)]
public global::System.DateTime? Birthdate { get; set; }

或更简单地说,是为了匹配您现有的代码:

[ProtoMember(20,DataFormat=DataFormat.WellKnown)]public DateTime? Birthdate;

就位了-应该使用相同的数据布局,并且应该获得相同的值。如果需要在平台之间交换数据,则建议使用此选项。但是,请注意,这是对现有布局的更改。如果您需要在不破坏现有用法的情况下进行迁移的提示,请告诉我-可能的(简短版本为“将字段20保留为旧样式;添加一个行为类似并使用新格式的新属性-仅序列化新一,但允许旧的反序列化”)。