我正在序列化数据,它可能是一个整数、一个包含其他嵌套对象的对象(列表),并尝试选择要使用的方法。在两个中,第一个是递归地创建字节向量,并将它们在调用函数中复制到更大的单个字节向量;第二个是使用某种我可以写入的流。最终,尽管有选择,我还是能够在可能发生的任何进一步处理中使用生成的二进制数组,例如。 G。我会压缩输出数据并通过网络发送它,或者只是将它的某些部分写入一个文件。
我希望在实现快速序列化程序的同时保持足够(或完全)的功能。我正在使用 Racket ,尽管任何其他 Scheme 实现也可以。
谢谢。
更新:
以下是我找到解决方案后添加的示例,以便用户节省一些时间来寻找如何写入数据的方式:]
write-byte
和 write-bytes
在您需要写入八位字节时特别有用。
> (bytes? (with-output-to-bytes (lambda () (write-byte 42))))
#t
> (bytevector? (with-output-to-bytes (lambda () (write-byte 42))))
#t
> (bytevector->u8-list (with-output-to-bytes (lambda () (write-byte 42))))
{42}
> (bytes->list (with-output-to-bytes (lambda () (write-byte 42) (write-bytes (integer->integer-bytes #x101CA75 4 #f #t)))))
(42 1 1 202 117)
最佳答案
您可以只使用write
将数据写入端口。您可以对所有值执行此操作,作为包含所有内容的列表。如果您遇到循环数据之类的问题,则可能需要稍作调整,其中将 print-graph
设置为 #t
可以很好地处理它。如果您希望输出为字节字符串,则可以使用 open-output-bytes
,或方便的 with-output-to-bytes
函数:
(with-output-to-bytes (lambda () (write (list value1 value2 value3))))
这不会像二进制表示那样紧凑——但如果您打算无论如何都压缩输出,那也没关系。
关于performance - 方案:数据序列化,高效[和功能],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3353087/