TPL
TPL说明网站
C语言中高效的序列化
您可以使用tpl快速轻松地存储和重新加载C数据。Tpl是一个用于序列化C数据的库。数据以自然二进制形式存储。该API很小,并试图保持“不碍事”。Tpl可以序列化许多C数据类型,包括结构。Tpl与文件、内存缓冲区和文件描述符一起工作,因此它适合用作文件格式、IPC消息格式或任何需要存储和检索数据的场景
表达你的数据
只需将正在处理的数据类型表示为tpl格式字符串。例如,如果您有一个数字id列表和相应的用户名,那么您的格式字符串是a (is)。将C变量映射到格式字符串,然后打包或解包数据。格式字符串让您专注于您的数据,而不是存储格式。
tpl的用途
Tpl提供了一种方便的文件格式。例如,假设一个程序需要存储一个用户名和id列表。这可以使用格式字符串A(si)来表示。如果程序需要两个这样的列表(例如,一个用于普通用户,一个用于管理员),则可以表示为A(si)A(si)。使用tpl很容易读写这类结构化数据。
Tpl也可以用作IPC消息格式。它可以处理字节顺序问题,并自动从流中拆分单个消息。
表达类型
tpl的“数据类型”被显式地声明为格式字符串。存储在tpl中的数据类型没有任何歧义。一些例子:
A(is)是由整串对组成的可变长度数组
A(is)A(is)是两个这样的数组,彼此完全独立
S(ci)是一个包含字符和整数的结构体
S(ci)#是后一种结构的定长数组
A(A(i))是一个嵌套数组,即由整数数组组成的数组
tpl映像
tpl映像是tpl的序列化形式,存储在内存缓冲区或文件中,或写入文件描述符。
tpl图像里有什么?
不需要了解tpl图像的内部结构。但对于好奇的人来说,图像是一个严格定义的二进制缓冲区,有两个部分,一个头和数据。头部编码图像的长度、格式字符串、端序和其他标志。数据部分包含打包的数据。
不需要框架
tpl映像的一个特性是可以将连续图像写入流,而不需要在它们之间使用任何分隔符。使用tpl_gather(或TPL_FD模式下的tpl_load)的读取器一次只能获得一个tpl映像。因此,tpl图像可以用作IPC消息格式,而不需要任何更高级别的帧协议。
数据可移植性
当正确使用tpl时,在一种CPU上生成的tpl映像通常可以移植到其他CPU类型。考虑到tpl是一种二进制格式,这可能会让人感到惊讶。但tpl经过精心设计,使其能够发挥作用。每个格式字符都有一个相关的显式大小的类型。对于整数和浮点类型,其“端序”或字节顺序约定因CPU而异,tpl在解包过程中自动且透明地纠正端序(如果需要)。浮点数有其特殊的困难。不保证浮点可移植性。也就是说,由于许多现代CPU使用IEEE 754浮点表示,因此数据可能在它们之间是可移植的。
XML and Perl
Note: The tplxml utility and the Perl module are currently unsupported in tpl 1.5.
XML
虽然tpl映像是一个二进制实体,但是您可以使用lang/perl目录中包含的tplxml实用程序查看XML格式的任何tpl映像。
tplxml文件。TPL > file.xml
TPLXML file.xml > file.tpl
该实用程序是双向的,如下所示。文件扩展名并不重要;tplxml检查它的输入,看它是tpl还是XML。您还可以将数据输送到它中,而不是给它一个文件名。tplxml实用程序很慢。它的目的有两个:调试(手工检查tpl中的数据),以及与基于xml的程序的互操作性。生成的XML通常是原始二进制tpl图像的十倍大。
Perl
在lang/ Perl /Tpl.pm中有一个Perl模块。Perl API对于编写与C程序互操作的Perl脚本非常方便,并且需要来回传递结构化数据。它是用纯Perl编写的。
构建和安装
Tpl不依赖于系统C库以外的库。您可以简单地将tpl源代码复制到您的项目中,这样就没有依赖项了。或者,您可以将tpl构建为库并将其链接到您的程序。
作为源
使用tpl的最简单方法是将源文件tpl.h和tpl.c(来自src/目录)直接复制到项目中,并与其他源文件一起构建它们。不需要特殊的编译器标志。
作为库
或者,从顶级目录将tpl构建为库,运行:
./configure
make
make install
测试套件
您可以通过以下命令编译并运行内置测试套件:
cd tests/
make