Ruby序列化和反序列化结构

时间:2019-07-22 19:18:45

标签: ruby serialization struct

我正在尝试序列化S3对象,以便以后可以反序列化。反序列化无法获取对象的类,并且未对对象的变量进行分组。这是我当前的代码:

require 'yaml'
def serialize_array_of_objects(array, filename)
  unless array.empty?
    File.open(filename, "w+") do |f|
      array.each { |element|
        serialized_object = YAML::dump(element)
        f.write(serialized_object)
      }
    end
  end
end

这是文件的内容(已编辑):

--- !ruby/struct:Aws::S3::Types::Object
key: file1.csv
last_modified: 2019-03-24 17:24:41.000000000 Z
etag: '"REDACTED"'
size: 41248
storage_class: STANDARD
owner:
--- !ruby/struct:Aws::S3::Types::Object
key: file2.csv
last_modified: 2019-04-24 15:30:41.000000000 Z
etag: '"REDACTED"'
size: 33527
storage_class: STANDARD
owner:

要反序列化我正在使用此代码的对象:

def serialized_file_to_array(filename)
  array = []
  File.open(filename, "r").each { |line|
    array << YAML::load(line)
  }
  return array
end

我的问题是对象在加载时变形。现在是数组:

[nil, {"key"=>"file1.csv"}, {"last_modified"=>2019-03-24 17:24:41 UTC}, {"etag"=>"\"REDACTED\""}, {"size"=>41248}, {"storage_class"=>"STANDARD"}, {"owner"=>nil}, nil, {"key"=>"file2.csv"}, {"last_modified"=>2019-04-24 15:30:41 UTC}, {"etag"=>"\"REDACTED\""}, {"size"=>33527}, {"storage_class"=>"STANDARD"}, {"owner"=>nil}]

我需要能够在反序列化版本中提取对象键值。

1 个答案:

答案 0 :(得分:0)

问题是您转储对象yaml文件中产生多行,但是您又加载了 lines 反序列化 lines 。显然每一行都不包含整个对象,这就是为什么要返回数组哈希(每行一个)的原因。

您需要收集行,直到新的对象标记出现在中,以读取整个文件内容,然后使用e将其拆分为多个对象。 G。正则表达式并加载拆分对象。

第一种方法是:

File.readlines(FILE).
    each_with_object([[], []]) do |line, (inner_acc, outer_acc)|
  if line.start_with?('---')
    outer_acc << YAML.load(inner_acc.join) unless inner_acc.empty?
    inner_acc.clear << line
  else
    inner_acc << line
  end
end.tap do |inner_acc, outer_acc|
  break outer_acc << YAML.load(inner_acc.join) # last chunk
end

使用正则表达式,它应该更简单。