我正在通过MessagePack将对象编码为Bytes
(即Slice(UInt8)
)。如何将其存储在仅接受字符串的数据存储客户端(例如Crystal-Redis)中?
答案 0 :(得分:1)
如果您没有其他选择将Slice存储为字符串,则可以将其编码为String,但代价是性能降低。
encoded = An_Object.to_msgpack # Slice(UInt8)
save_to_datastore "my_stuff", Base64.strict_encode(encoded)
from_storage = get_from_datastore "my_stuff"
if from_storage
My_MsgPack_Mapping.from_msgpack( Base64.decode(from_storage) )
end
或者您可以使用Slice#hexstring和String#hexbytes:
encoded = An_Object.to_msgpack # Slice(UInt8)
save_to_datastore "my_stuff", encoded.hexstring
from_storage = get_from_datastore "my_stuff"
if from_storage && from_storage.hexbytes?
My_MsgPack_Mapping.from_msgpack( from_storage.hexbytes )
end
(Crystal-Redis用户还有另一种选择:see this issue。)
答案 1 :(得分:0)
Crystal和Redis都应该能够处理具有无效UTF-8字节的字符串,因此您可以直接从切片创建String
并将其存储到Redis,反之亦然。
这当然不是完全安全的:你应该确保避免调用任何期望有效UTF-8字符串的字符串方法。 但除此之外,这种直接的方法应该是完全没问题的。与使用字符串编码相比,它更快,内存效率更高。
redis.set key, String.new(slice)
redis.get(key).to_slice