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 )をバイナリファイルに保存したいのですが、それはシリアライゼーションと呼ばれていると思います。私はそれをグーグルで検索し、標準ライブラリのマーシャルがこれを実行できることを発見しました。これは、インターネット上の例に従ってこれを行う方法の例です。

#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のサイズを確認すると. わずか4バイトであることがわかりました。次に、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

4バイト?空の配列をマーシャリングする[]と、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 に答える