我在c#中使用ProtoBuf序列化了大量数据。
同事希望用Python阅读这些文件。
这可以通过Python类与c#不同来实现。
这是c#类:
[ProtoContract]
public class TickRecord
{
[ProtoMember(1, DataFormat = DataFormat.FixedSize, IsRequired = true)]
public DateTime DT;
[ProtoMember(2, DataFormat = DataFormat.FixedSize, IsRequired = true)]
public double BidPrice;
[ProtoMember(3, DataFormat = DataFormat.FixedSize, IsRequired = true)]
public double AskPrice;
[ProtoMember(4, DataFormat = DataFormat.FixedSize, IsRequired = true)]
public int BidSize;
[ProtoMember(5, DataFormat = DataFormat.FixedSize, IsRequired = true)]
public int AskSize;
}
答案 0 :(得分:0)
看起来像protobuf-net
;幸运的是,该库包含一个工具来吐出.proto模式,以了解它对模型的看法:
var schema = Serializer.GetProto<TickRecord>();
出现为:
message TickRecord {
required bcl.DateTime DT = 1;
required double BidPrice = 2 [default = 0];
required double AskPrice = 3 [default = 0];
required sfixed32 BidSize = 4 [default = 0];
required sfixed32 AskSize = 5 [default = 0];
}
其中bcl.DateTime
是&#34; bcl.proto&#34;中描述的protobuf-net复杂数据类型。
坦率地说,我建议您使用unix时间将日期时间更改为long
- 这会让事情变得更加简单。这给了你:
message TickRecord {
required sfixed64 DT = 1 [default = 0];
required double BidPrice = 2 [default = 0];
required double AskPrice = 3 [default = 0];
required sfixed32 BidSize = 4 [default = 0];
required sfixed32 AskSize = 5 [default = 0];
}
你可以给你的同事,他们可以在他们的环境中运行protoc
或他们需要的协议缓冲区的任何其他平台/库工具,并且应该设置它们。序列化格式是故意跨平台的,因此数据应该可以正常工作。
注意:*WithLengthPrefix
通过将数据包装在外壳中来工作。我需要查看您正在使用的确切参数,以建议您的同事。
注意:将DateTime
更改为long
是一个重大变化;如果你不能这样做,你的同事将不得不查看bcl.proto(只是谷歌)并将其翻译成python。