Ruby序列化和反序列化结构
我正在尝试序列化一个S3对象,以便以后可以反序列化。反序列化无法获取对象的类,并且没有对对象的变量进行分组。以下是我当前的代码: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::
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