【问题标题】:"ArgumentError: string contains null byte" when writing Marshalled data into a file将编组数据写入文件时出现“ArgumentError:字符串包含空字节”
【发布时间】:2016-01-24 23:22:07
【问题描述】:

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

File.write Marshal.dump(users),"users.txt"

我明白了:

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

我使用 JSON 和 YAML 也得到了类似的结果。我该怎么做才能从字符串中删除空字节?我试过 String#scrub 但没有帮助。

【问题讨论】:

    标签: ruby json null yaml marshalling


    【解决方案1】:

    文件名和内容参数的顺序颠倒了。第一个参数必须是名称,第二个参数必须是内容。引发参数错误是因为file names shouldn't contain null bytes

    由于您处理的是二进制数据,因此您应该使用IO.binwrite

    File.binwrite "users.txt", Marshal.dump(users)
    

    【讨论】:

    • 您可能还需要注意,Marshal 不是一种很好的持久化格式,因为Marshal 格式不能移植到未来的 Ruby 版本中。
    • @muistooshort 我正在研究使用 Marshal 格式,我很好奇你关于它不能移植到未来版本的声明。我在哪里可以阅读更多内容?你有什么推荐的替代品吗?
    • @Finn 阅读fine Marshal manual。你最好使用 JSON 或 YAML 文件来满足简单的需求,使用 SQLite 来满足更复杂的自包含应用程序,以及使用某种“真实”数据库来满足更大的应用程序。
    • 谢谢,太好了。还了解到,如果解析用户数据,Marshal 非常容易受到注入,就像在 safe_load 之前的 YAML 一样。这里有更多的上下文:tenderlovemaking.com/2013/02/06/yaml-f7u12.html 做了一个快速的基准测试,当涉及到“转储”哈希时,JSON 比 YAML 快 A LOT(大约 30 倍)。 YAML:40 秒,元帅:0.9 秒,JSON:1.2 秒(n=100,000)
    猜你喜欢
    • 1970-01-01
    • 2012-08-08
    • 1970-01-01
    • 2012-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-01
    相关资源
    最近更新 更多