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)