代码之家  ›  专栏  ›  技术社区  ›  YasirA

方案:数据序列化,高效[和功能]

  •  3
  • YasirA  · 技术社区  · 16 年前

    我正在序列化数据,可能是一个整数,一个对象(列表)和其他嵌套对象,并试图选择使用什么方法。其中,第一种是递归地创建字节向量,并将它们在调用函数中复制到一个较大的字节向量中;第二种是使用某种我可以写入的流。最终,尽管有选择,我还是能够在任何可能发生的进一步处理中使用生成的二进制数组,例如。g。我会压缩输出数据并通过网络发送,或者只是将其中的一些部分写入一个文件。

    我想保持足够的功能(或完全),但实现快速序列化程序。我在用 Racket

    非常感谢。

    更新:

    以下是我在找到解决方案后添加的示例,这样用户就可以节省一些搜索数据写入方式的时间:]

    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)
    
    2 回复  |  直到 15 年前
        1
  •  4
  •   Eli Barzilay    16 年前

    你可以只用 write print-graph #t 会处理得很好的。如果您希望输出变成字节字符串,那么可以使用 open-output-bytes ,或方便的 with-output-to-bytes 功能:

    (with-output-to-bytes (lambda () (write (list value1 value2 value3))))
    

    这不会像二进制表示那样紧凑——但是如果您打算压缩输出,这并不重要。

        2
  •  2
  •   YasirA    16 年前

    可能 open-bytevector-output-port 是我要找的:

    #lang scheme
    
    (require rnrs/bytevectors-6)
    (require rnrs/io/ports-6)
    
    (define-values (oup ext-proc) (open-bytevector-output-port))
    (write 4 oup)
    (write 2 oup)
    (ext-proc)
    (make-bytevector 3 1)
    

    结果:

    Добро пожаловать в DrScheme, версия 4.2.5 [3m].
    Язык: scheme; memory limit: 128 MB.
    #"42"
    #"\1\1\1"
    >