3

谢谢你的时间!

我有这样的课

class Vuser

    def initialize (logfile_name, iteration_hash)
        @logfile_name = logfile_name
        @iteration_hash = iteration_hash
    end

    attr_accessor :logfile_name, :iteration_hash

    def output_iteration_info ()
        puts @logfile_name
        puts @iteration_hash
    end
end

并且会有一个数组来存储 Vuser 类的实例。假设数组的名称是 vuser_ary。

我想将此数组( vuser_ary )存储到二进制文件中,我认为它称为序列化。我用谷歌搜索,发现标准库中的 Marshal 可以做到这一点。这是我根据 Internet 上的示例如何执行此操作的示例:

#serialization
File.open("some.file","wb") do |file|
   Marshal.dump(vuser_ary,file)
end

#loading
vuser_ary = nil
File.open("some.file","rb") {|f| vuser_ary = Marshal.load(f)}

但是当我检查 some.file 的大小时。我发现它只有四个字节。然后我意识到存储在 some.file 中的数据可能是引用而不是 vuser_ary 的值。

然后我的问题是如何将 vuser_ary 的值存储到二进制文件中。如何更改我的代码以实现这一目标?提前致谢!

顺便说一句:存储在 vuser_ary 中的值将是这样的:

RO_3.2_S4_CommericalRealEstate1_274.log

{1=>“失败”,2=>“失败”,3=>“通过”,4=>“通过”,5=>“失败”}

RO_3.2_S4_CommericalRealEstate1_275.log

{11=>“失败”、2=>“失败”、3=>“失败”、4=>“通过”、5=>“失败”

RO_3.2_S4_CommericalRealEstate1_276.log

{1=>“失败”,2=>“失败”,3=>“通过”,4=>“通过”,5=>“失败”}

RO_3.2_S4_CommericalRealEstate1_277.log

{1=>“失败”,2=>“失败”,3=>“通过”,4=>“通过”,5=>“失败”}

RO_3.2_S4_CommericalRealEstate1_278.log

{1=>“失败”,2=>“失败”,3=>“通过”,4=>“通过”,5=>“失败”}

RO_3.2_S4_CommericalRealEstate1_279.log

{1=>“失败”,2=>“失败”,3=>“通过”,4=>“通过”,5=>“失败”}

RO_3.2_S4_CommericalRealEstate1_280.log

{1=>“失败”,2=>“失败”,3=>“失败”,4=>“通过”,5=>“失败”}

4

1 回答 1

2

四个字节?碰巧编组空数组[]会在我的 Ruby 上生成一个 4 字节的字符串:

> Marshal.dump([]).length
 => 4 

尝试编组时确定vuser_ary它不是空的吗?

碰巧的是,对对象的“引用”和对象本身之间没有区别:Ruby 中没有指针,所以如果你有一个数组(并且它不是空的),那么它将被编组:

> Marshal.dump([1, 2, 3]).length
 => 10

为了更好的衡量:

> vuser_ary = [{1=>"Fail", 2=>"Fail", 3=>"Pass", 4=>"Pass", 5=>"Fail"}]
 => [{1=>"Fail", 2=>"Fail", 3=>"Pass", 4=>"Pass", 5=>"Fail"}] 
> Marshal.dump(vuser_ary).length
 => 72  
于 2012-07-10T11:57:43.737 回答