Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby序列化和反序列化结构_Ruby_Serialization_Struct - Fatal编程技术网

Ruby序列化和反序列化结构

Ruby序列化和反序列化结构,ruby,serialization,struct,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::

我正在尝试序列化一个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
以下是该文件的内容(已编辑):

要反序列化我正在使用的对象,请执行以下代码:

def serialized_file_to_array(filename)
  array = []
  File.open(filename, "r").each { |line|
    array << YAML::load(line)
  }
  return array
end
我需要能够在反序列化版本中提取对象键值。

问题是您转储对象,导致在
yaml
文件中有几行,但您加载了反序列化行。每一行显然不包含整个对象,这就是为什么返回一个数组散列(每行一个)

您需要收集行,直到新的对象标记出现,或者要读取整个文件内容,请使用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
File.readlines(文件)。
每个带有对象([[],[])do |行的_(内部_acc,外部_acc)|
if line.u以?('--'开头)
outer_acc问题是您转储对象,导致在
yaml
文件中出现几行,但您将反序列化行加载回行。每一行显然不包含整个对象,这就是为什么返回一个数组散列(每行一个)

您需要收集行,直到新的对象标记出现,或者要读取整个文件内容,请使用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
File.readlines(文件)。
每个带有对象([[],[])do |行的_(内部_acc,外部_acc)|
if line.u以?('--'开头)
外环
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