Tag: 编组

如何从marshal转储中排除实例变量

我的对象包含一个实例变量,该变量指向其他几个属性中的File对象。 因为这个Marshal不能序列化它。 如何编写一个定制的dump方法,以便只排除该实例变量? class Area attr_accessor :area attr_reader :several_other_attributes …….. def initialize(name) @area = name @several_other_attributes = …. @log = File.open( ‘test.log’, ‘w’) end end

Rails 2.3.14:如何序列化ActionController :: Request对象?

我需要根据Rails 2.3.14控制器收到的请求对象的类型编写一些Do Things方法。 但是,我不想启动整个应用程序,甚至也不需要控制器; 我想只有一个这样的对象的编组副本,我可以在Rails环境之外工作。 不幸的是,传递给控制器​​的ActionController::Request对象在其内部深处包含Proc对象,这些对象本质上是不可序的。 有没有人知道一种方法来序列化这些对象之一,以便我可以将它存储在一个数据文件中并在另一个脚本中重新创建它? 我宁愿不修补Proc类来提供#marshal_dump方法.. 谢谢!

使用1900年之前的日期缓存模型时的编组错误

我有一些具有“published_on”属性的活动记录模型。 当我尝试使用在1/1/1900之前的published_on日期缓存模型时,我收到如下错误: Marshalling error for key ‘popular_products’: year too big to marshal: 1300 UTC You are trying to cache a Ruby object which cannot be serialized to memcached. 我可以用ruby重现类似的错误: irb(main)> Marshal.dump( Time.parse(“1/1/1900”) ) ArgumentError: year too big to marshal: 1899 UTC 使用1900年之前的日期缓存模型的正确方法是什么?

Marshal无法使用默认proc(TypeError)转储哈希

我有这个ruby脚本生成一个哈希并将其保存到文件中。 有时文件不存在或为空,所以我总是首先检查它的存在。 然后我将旧值加载到我的哈希值并尝试再次保存。 我一直在努力解决这个问题很长一段时间。 这是一个示例: newAppName = ARGV[0] newApp = Hash.new newApp[“url”] = ARGV[1] newApp[“ports”] = ARGV[2].to_i apps = Hash.new { |h, k| h[k] = Hash.new } # apps[“test”] = {“url” => “www.test.com”, “ports” => 3 } appsFile = ‘/home/test/data/apps’ if File.exists?(appsFile) apps = Marshal.load File.read(appsFile) else puts “Inserting first app into list…” end apps[newAppName] […]

如何告诉Ruby不要序列化属性或如何正确地重载marshal_dump?

我的AR中有一个属性:B不可序列化。 o = Discussion.find(6) Marshal.dump(o) TypeError: no marshal_dump is defined for class Proc from (irb):10:in `dump’ 我知道罪魁祸首和我想要的是在任何序列化发生之前将此变量设置为nil。 我可以做到这一点,但我坚持使用正确的方法来覆盖marshal_dump def marshal_dump @problem = nil # what is the right return here? end 或者是否有办法告诉Ruby或AR不要序列化对象?

在Ruby中深度复制对象的最有效方法是什么?

我知道序列化一个对象是(据我所知)有效深度复制一个对象的唯一方法(只要它不像IO和诸如此类的状态),但是这种方式比另一种方式更有效吗? 例如,因为我正在使用Rails,所以我总是可以使用ActiveSupport::JSON , to_xml – 从我可以告诉编组的对象是最常被接受的方法之一。 我希望编组可能是最有效的,因为它是一个Ruby内部,但我错过了什么? 编辑 :请注意,它的实现是我已经涵盖的内容 – 我不想替换现有的浅拷贝方法(如dup和clone ),所以我最终可能会添加Object::deep_copy ,其结果是无论上述哪种方法(或任何建议:)都有最少的开销。

Marshal ruby​​ hash with default proc – 删除默认的proc?

我有一个带有默认触发器的Hash,我想将Marshal设置为一个文件,但是默认的proc会阻止我这样做。 而不是编写我自己的_dump和_load方法,而不是删除默认的proc而不是? 在我编组时,我永远不会再需要默认的proc。

在Ruby中使用Marshal :: dump进行对象序列化时如何写入文件

假设我有类Line的对象行 : class Line def initialize point1, point2 @p1 = point1 @p2 = point2 end end line = Line.new … 如何对行对象进行二进制序列化? 我尝试过: data = Marshal::dump(line, “path/to/still/unexisting/file”) 但它创建了文件,并没有添加任何东西。 我读了Class:IO文档,但我无法真正理解它。

如何将对象保存到文件?

我想将一个对象保存到一个文件,然后轻松地从文件中读取它。 举个简单的例子,假设我有以下3d数组: m = [[[0, 0, 0], [0, 0, 0], [0, 0, 0]], [[0, 0, 0], [0, 0, 0], [0, 0, 0]]] 是否有一个简单的Ruby API,我可以使用它来实现这一点,而无需编写解析器来解释文件中的数据? 在示例中,我给它很简单,但随着对象变得更加复杂,使对象持久化变得很烦人。