红宝石元帅系列化

时间:2012-07-10 11:53:33

标签: ruby marshalling

谢谢你的时间!

我得到了这样的课程

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)存储到二进制文件中,我认为它被称为序列化。我谷歌它,发现标准库中的元帅可以做到这一点。 以下是根据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的值存储到二进制文件中。如何更改代码以实现此目的?提前谢谢!

BTW:存储在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 =>“失败”}

1 个答案:

答案 0 :(得分: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