将新的msgpack数据附加到文件末尾

时间:2015-02-09 20:04:41

标签: msgpack

将对象附加到msgpack数据而不先解码它是否有效?

是的,就像那样:

  • 编码data1
  • pack data1
  • 将打包数据1写入文件

然后,

  • pack data2
  • 将打包数据2附加到文件末尾

或应该是:

  • 读取文件
  • msgunpack文件 - > DATA1
  • 创建data1_2(包括data1,data2)
  • pack data1_2
  • 将打包数据1_2写入文件

2 个答案:

答案 0 :(得分:1)

您只需附加到该文件即可。请查看How to unpack a msgpack file?我的示例代码以阅读写作,您将看到我正在附加,这是有效的。

答案 1 :(得分:0)

扩展 Alex 的回答,因为 https://docs.spring.io/spring-integration/reference/html/jdbc.html#batch-update 仍然没有阐明这一点,而且我不确定如何将该范式转换为其他库。我不确定这是否是官方规范的一部分,但它是最不令人惊讶的实现方式,并且具有直观的意义。如果您想要仅附加的数据格式,这将非常有用。

您应该能够简单地连接任何打包的 msgpack 对象。您的库应提供某种 Unpacker 类,该类采用包含一个或多个串联 msgpack 对象的字节流,并发出解包结构流。如果您的库缺少此功能,您可能需要自己实现。

这是在 python 的 spec 包中的样子:

from io import BytesIO
import msgpack as mp

buf = BytesIO()
buf.write(packer.pack(1))
buf.write(packer.pack(2))
buf.write(packer.pack('foo'))
buf.write(packer.pack(True))
buf.write(packer.pack({"spam":"eggs"}))

print('file contents: {}'.format(buf.getvalue()))
buf.seek(0)

unpacker = mp.Unpacker(buf)
for i, obj in enumerate(unpacker):
    print('{}: {} {}'.format(i, repr(obj), type(obj)))

出:

file contents: b'\x01\x02\xa3foo\xc3\x81\xa4spam\xa4eggs'
0: 1 <class 'int'>
1: 2 <class 'int'>
2: 'foo' <class 'str'>
3: True <class 'bool'>
4: {'spam': 'eggs'} <class 'dict'>

如果您想实现自己的,python 回退 msgpack 是非常易读的。

相关问题