我可以反序列化使用Length将c#类修复为Python类吗?

时间:2016-07-01 13:53:20

标签: c# python protocol-buffers

我在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;
}

1 个答案:

答案 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。