Ruby &引用;ArgumentError:字符串包含空字节";将封送数据写入文件时

Ruby &引用;ArgumentError:字符串包含空字节";将封送数据写入文件时,ruby,json,null,yaml,marshalling,Ruby,Json,Null,Yaml,Marshalling,我有一个大数组,我想保存到文件中。但当我发布: File.write Marshal.dump(users),"users.txt" 我得到: ArgumentError: string contains null byte from (pry):201:in `write' 我也用JSON和YAML得到了类似的结果。如何从字符串中删除空字节?我尝试了String#scrub,但没有帮助。文件名和内容参数的顺序颠倒了。第一个参数必须是名称,第二个参数必须是内容。引发参数错误的原因是 由于您处

我有一个大数组,我想保存到文件中。但当我发布:

File.write Marshal.dump(users),"users.txt"
我得到:

ArgumentError: string contains null byte
from (pry):201:in `write'

我也用JSON和YAML得到了类似的结果。如何从字符串中删除空字节?我尝试了String#scrub,但没有帮助。

文件名和内容参数的顺序颠倒了。第一个参数必须是名称,第二个参数必须是内容。引发参数错误的原因是

由于您处理的是二进制数据,因此应使用:


您可能还想注意到,
Marshal
不是一种很好的持久化格式,因为
Marshal
格式不能移植到Ruby的未来版本。@muistooshort我正在研究使用Marshal格式,我很好奇您关于它不能移植到未来版本的说法。我在哪里可以读更多?“你有推荐的替代方案吗?”芬恩读了这篇文章。您最好使用JSON或YAML文件满足简单需求,使用SQLite满足更复杂的自包含应用,使用“真实”数据库满足更大的应用。谢谢,这太棒了。还了解到,如果解析用户数据,Marshal非常容易被注入,就像安全加载之前的YAML一样。这里有更多的上下文:做了一个快速的基准测试,JSON在“转储”散列时比YAML快得多(大约30倍)。YAML:40秒,封送:0.9秒,JSON:1.2秒(n=100000)
File.binwrite "users.txt", Marshal.dump(users)