protobuf数据类型与delphi数据类型映射
protobuf数据类型:
double: 浮点数
float: 单精度浮点
int32: int类型,使用可变长编码,编码负数不够高效,如果有负数那么使用sint32
sint32: int类型,使用可变长编码, 有符号的整形,比通常的int32高效;
uint32: 无符号整数使用可变长编码方式;
int64 long long , 使用可变长编码方式。编码负数时不够高效——如果有负数,可以使用sint64;
sint64 long long 使用可变长编码方式。有符号的整型值。编码时比通常的int64高效;
uint64: 无符号整数使用可变长编码方式;
fixed32 : 总是4个字节。如果数值总是比总是比2^28大的话,这个类型会比uint32高效。
fixed64: 总是8个字节。如果数值总是比总是比2^56大的话,这个类型会比uint64高效。
sfixed32: 总是4个字节。
sfixed64: 总是8个字节。
bool:bool值
string: 一个字符串必须是UTF-8编码或者7-bit ASCII编码的文本。
bytes: 可能包含任意顺序的字节数据。类似java的ByteString以及 c++ string;
protobuf数据类型
message Test { optional double dbl = 1; optional float flt = 2; optional int32 i32 = 3; optional int64 i64 = 4; optional uint32 ui32 = 5; optional uint64 ui64 = 6; optional sint32 si32 = 7; optional sint64 si64 = 8; optional fixed32 fi32 = 9; optional fixed64 fi64 = 10; optional sfixed32 sfi32 = 11; optional sfixed64 sfi64 = 12; optional bool bl = 13; optional string str = 14; optional bytes bts = 15; }
与之对应的delphi数据类型
type TTestRecord = record [Serialize(1)] Dbl : Double; [Serialize(2)] Flt : Single; [Serialize(3)] I32 : LongInt; [Serialize(4)] I64 : Int64; [Serialize(5)] Ui32 : LongWord; [Serialize(6)] Ui64 : UInt64; [Serialize(7)] Si32 : LongInt; [Serialize(8)] Si64 : Int64; [Serialize(9)] Fi32 : LongWord; [Serialize(10)] Fi64 : UInt64; [Serialize(11)] Sfi32 : LongInt; [Serialize(12)] Sfi64 : Int64; [Serialize(13)] Bl : Boolean; [Serialize(14)] Str : String; [Serialize(15)] Bts : TBytes; end;
关于TDateTime类型
protobuf没有TDateTime类型,榔个办?
解决方法是用时间戳,使用int64
uses dateutils;
DateTimeToUnix(),将TDateTime转换为时间戳
UnixToDateTime(),将时间戳转换为TDateTime