Я сохраняю объект SortedSet в файле с помощью Marshal.dump. Элементы в наборе также являются объектами (которые включают Comparable и реализуют метод ‹=>).
Позже при восстановлении этого объекта с помощью Marshal.load SortedSet, загружаемый из файла, не сортируется...
Любая идея, почему или как это исправить?
Вот упрощенный пример, который воспроизводит проблему:
require 'set'
class Foo
include Comparable
attr_accessor :num
def initialize(num)
@num = num
end
def <=>(other)
num <=> other.num
end
end
f1 = Foo.new(1)
f2 = Foo.new(2)
f3 = Foo.new(3)
s = SortedSet.new([f2, f1, f3])
File.open('set_test.dump', 'wb') { |f| Marshal.dump(s, f) }
Затем, чтобы загрузить объект из файла, который я использую -
File.open('set_test.dump', 'rb') { |f| ls = Marshal.load(f) }
** Я использую Rails 3.2.3 с Ruby 2.1.8.
** При загрузке дампа из файла - делайте это в новой/отдельной консоли rails (и не забудьте скопировать-вставить определение класса Foo :-) )
File.open('set_test.dump', 'rb') { |f| ls = Marshal.load(f) }
также может быть записано какMarshal.load(File.binread('set_test.dump'))
. - person Cary Swoveland   schedule 24.01.2017Marshal.load
также возвращает#<SortedSet: {#<Foo:0x0000000291b480 @num=2>, #<Foo:0x0000000291bbb0 @num=1>, #<Foo:0x00000002919d10 @num=3>}>
- person Eric Duminil   schedule 24.01.2017Marshal
. И он прав. При создании дампа с помощью Marshal с определенной версией Ruby он может неправильно загрузиться с другой версией Ruby. - person Shai Kerer   schedule 24.01.2017