紧凑、高效、可扩展的二进制序列化格式
extprot的Python项目详细描述
extprot:紧凑、高效、可扩展的二进制序列化格式
这是“extprot”序列化方案的一个python实现,其
详细信息请参见:
http://eigenclass.org/r2/writings/extprot extensible protocol s intro
类似于google的协议缓冲区和apache thrift,extprot允许定义结构化数据“消息”。消息本质上是一组类型化的键值对,它们可以有效地序列化到或从
压缩二进制格式,并在语言无关的“协议”文件中定义。
这里有一个简单的extprot消息示例:
message person={
id:int;
name:string;
电子邮件:[string]
}
这样的协议描述
被编译成一组python类,这些类可以使用
标准语法和习惯用法进行操作。如果上面的协议记录在文件
“person.proto”中,这里有一个简单的示例说明如何使用该协议:
>;>extprot.import廑u protocol(“person.proto”,globals())
>;>p1=person(1,“guido”)
>; []br/>>;>p1.emails.append(“guido@python.org”)
>;>;p1.emails.append(7)所有字段都会动态地进行类型检查
回溯(大多数最近调用的最后一个):
…
valueerror:不是有效字符串:7
>;>;print repr(p1.to_string())
'\x01\x1f\x03\x00\x02\x03\x05 guido\x05\x13\x01\x03\x10guido@python.org'
>;>;print person.from_string(p1.to_string()).name
'guido'
>;
extprot与相关序列化技术相比具有优势:
*强大的类型系统;强类型元组和列表,标记为不相交的联合,参数多态性。
*自定界数据;所有序列化的消息都指示其长度,
允许轻松地流式传输和跳过消息。
*自描述数据;可以重建消息的“骨架”
没有协议定义。
*紧凑的二进制格式;与协议缓冲区/节约相当,但由于具有自限制特性,会有一些开销。
这些特性结合在一起,使extprot具有很强的可扩展性,通常允许
消息在协议
扩展之间保持向后*和*向前兼容性,这些扩展包括:向消息添加字段,向
元组添加元素,向不相交的并集添加事例,以及将基元类型提升为
元组,list或union。
extprot.import_protocol()函数将动态加载协议文件并将其转换为相应的python类结构。这在开发协议时非常方便,因为它避免了额外的编译步骤,但确实增加了一些启动开销,并且需要pyparsing模块。
使用extprot.compile_protocol()函数或通过extprot/compiler.py管道传输文件,如下所示:
$cat mydefs.proto python extprot/compiler.py>;mydefs.py
这是“extprot”序列化方案的一个python实现,其
详细信息请参见:
http://eigenclass.org/r2/writings/extprot extensible protocol s intro
类似于google的协议缓冲区和apache thrift,extprot允许定义结构化数据“消息”。消息本质上是一组类型化的键值对,它们可以有效地序列化到或从
压缩二进制格式,并在语言无关的“协议”文件中定义。
这里有一个简单的extprot消息示例:
message person={
id:int;
name:string;
电子邮件:[string]
}
这样的协议描述
被编译成一组python类,这些类可以使用
标准语法和习惯用法进行操作。如果上面的协议记录在文件
“person.proto”中,这里有一个简单的示例说明如何使用该协议:
>;>extprot.import廑u protocol(“person.proto”,globals())
>;>p1=person(1,“guido”)
>;
>;>;p1.emails.append(7)所有字段都会动态地进行类型检查
回溯(大多数最近调用的最后一个):
…
valueerror:不是有效字符串:7
>;>;print repr(p1.to_string())
'\x01\x1f\x03\x00\x02\x03\x05 guido\x05\x13\x01\x03\x10guido@python.org'
>;>;print person.from_string(p1.to_string()).name
'guido'
>;
extprot与相关序列化技术相比具有优势:
*强大的类型系统;强类型元组和列表,标记为不相交的联合,参数多态性。
*自定界数据;所有序列化的消息都指示其长度,
允许轻松地流式传输和跳过消息。
*自描述数据;可以重建消息的“骨架”
没有协议定义。
*紧凑的二进制格式;与协议缓冲区/节约相当,但由于具有自限制特性,会有一些开销。
这些特性结合在一起,使extprot具有很强的可扩展性,通常允许
消息在协议
扩展之间保持向后*和*向前兼容性,这些扩展包括:向消息添加字段,向
元组添加元素,向不相交的并集添加事例,以及将基元类型提升为
元组,list或union。
extprot.import_protocol()函数将动态加载协议文件并将其转换为相应的python类结构。这在开发协议时非常方便,因为它避免了额外的编译步骤,但确实增加了一些启动开销,并且需要pyparsing模块。
使用extprot.compile_protocol()函数或通过extprot/compiler.py管道传输文件,如下所示:
$cat mydefs.proto python extprot/compiler.py>;mydefs.py