Tag: 序列化

Rails中字段的自定义序列化

有没有办法为rails中的字段进行自定义序列化,这是一种在保存字段并加载以从/转换为最终保存在数据库中的字符串时运行的方法。 具体来说,我想做的是有一个类型符号的字段,如性别,可能的值:男性和女性在数据库中存储“男性”和“女性”。 有一些解决方法,例如: def gender read_attribute(:gender).try(:to_sym) end 但是这使得obj.attributes保持不变,所以它是一个漏洞的抽象。

Ruby使用JSON序列化struct

我试图将一个简单的结构序列化为JSON,它工作正常,但我不能让它从JSON创建该结构的实例。 这是我试图这样做的方式。 require ‘rubygems’ require ‘json’ Person = Struct.new(:name, :age) json = Person.new(‘Adam’, 19).to_json puts json me = JSON.load(json) puts me.name 我得到以下输出: “#” /usr/lib/ruby/1.9.1/json/common.rb:148:in `parse’: 746: unexpected token at ‘”#”‘ (JSON::ParserError) from /usr/lib/ruby/1.9.1/json/common.rb:148:in `parse’ from /usr/lib/ruby/1.9.1/json/common.rb:309:in `load’ from why.rb:9:in `’

如何访问Ruby中的符号表?

有没有办法访问Ruby中符号表中的所有内容? 我希望能够序列化或以其他方式保存程序运行的当前状态。 为此,我似乎需要能够遍历范围内的所有变量。

使用带有序列化自定义类的Rails表单助手

我正在尝试在单个DB字段中保存选项的哈希值。 表单能够将数据保存到数据库,但是当我去编辑它时无法再次检索它(例如,除了wp_options字段之外,所有其他字段都是预先填充的)。 class Profile < ActiveRecord::Base serialize :wp_options end 这是我的自定义类: class WP_Options attr_accessor :wp_name, :wp_desc, :wp_limit end 在我的forms: true) do |f| %> … … 在我的控制器中: @profile = Profile.new(:wp_options => WP_Options.new) 在我的数据库列’wp_options’中: — !map:ActiveSupport::HashWithIndifferentAccess wp_name: Test 任何建议都会非常感激。

将Ruby对象序列化为JSON并返回?

我想将一个对象序列化为JSON,将其写入文件并将其读回。 现在我希望在.net中你有json.net之类的东西,你可以这样做: JsonSerializer.Serialize(obj); 并完成它。 你得到了JSON字符串。 我如何在Ruby中执行此操作? 没有Rails,没有ActiveRecord,没有任何东西。 有没有找不到的gem? 我安装了JSON gem并调用: puts JSON.generate([obj]) 其中obj是一个像这样的对象: class CrawlStep attr_accessor :id, :name, :next_step def initialize (id, name, next_step) @id = id @name = name @next_step = next_step end end obj = CrawlStep.new(1, ‘step 1’, CrawlStep.new(2, ‘step 2’, nil)) 我得到的全部是: [“#”] 我究竟做错了什么?

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

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

如何用数组编组哈希?

我该怎么做来编组数组的哈希? 以下代码仅打印{} 。 s = Hash.new s.default = Array.new s[0] << "Tigger" s[7] << "Ruth" s[7] << "Puuh" data = Marshal.dump(s) ls = Marshal.restore( data ) p ls 如果散列不包含数组,则会正确恢复。

Ruby守护进程使瞬态Ruby实例的对象保持活动状态

Ruby是否提供了一种机制来在不同的运行Ruby进程之间共享变量(更重要的是,类对象和我认为对此有用的任何其他数据抽象)? 例如,如果我有一个实例化的类,初始化并仔细调整到某个状态,我希望该状态全局可用于我所有其他独立的Ruby和Irb运行全天,超过最初使用的进程的生命周期它。 我现在正在考虑有效解决这个问题的一个场景是创建一个微型Ruby脚本,仅仅作为我选择的持久对象和变量的守护者 ,并使用守护进程gem或类似物进行守护 。 设置在早上1点,在所有事情结束时在晚上拆除。 在整个一天中,另一个Ruby程序的许多实例 – 包含我的实际业务逻辑的程序 – 将来去能够使用和操作我在上面的守护进程中保持活动的所选对象。 我应该学习如何将复杂对象序列化到磁盘吗? (实际上更喜欢RAM不是磁盘,因为它无论如何都是暂时的,并且重新创建它只需花费很多时间)

watir浏览器对象可以在以后的Ruby进程中重用吗?

所以,让我们说经常运行一个脚本来打开一个浏览器并做网络事情: require ‘watir-webdriver’ $browser = Watir::Browser.new(:firefox, :profile => “botmode”) => # 它可以使用browser.close优雅地结束,或者它可能会更快崩溃并留下需要大量内存的Firefox进程,直到它们累积并使服务器慢速爬行时才会被忽视。 我的问题有两个: 什么是一个好的做法,以确保即使在任何导致立即错误退出的脚本失败的情况下,子进程将始终被清理(我已经有许多短的begin-rescue-end块用于其他无关的小测试) 更重要的是,我可以简单地记住这个Watir :: Browser:0x7fc97b06f558对象地址或PID,并在一个全新的Ruby进程中将其重新分配给另一个$ browser变量,例如irb? 即,webdriver上的孤立浏览器可以在同一台机器上使用watir-webdriver在其他程序中重新附加? 从irb我可以进入并重新连接到崩溃的Ruby脚本留下的浏览器,检查它所在的网站,检查出错的地方,哪些元素与预期不同等等。 后者的另一个非常有利的用途是避免每天可能有数百个浏览器启动和关闭的开销……最好将一个活着作为一个守护进程。 第一次运行将尝试使用我专门准备的botmode配置文件重用以前的浏览器对象,否则创建一个。 然后我故意不在我的脚本末尾调用$ browser.close。 如果没有其他的东西我在工作中杀死Xvfb:99显示FF在一天结束时运行(无论如何,如果仍在运行,FF别无选择,只能死掉它)。 是的我知道Selenium独立jar,但也试图避免那个java服务足迹。 如果这是一个基本的Ruby问题,请道歉。 我只是不确定如何表达它并继续获得不相关的搜索结果。

ruby序列化(Marshaling)如何工作?

我已经找到了关于这个主题的一些信息( 比如这个链接) ,但没有任何东西可以告诉我它是如何实际工作的。 如果你不想阅读下面的文章,这里有真正的问题: 我应该如何实现marshal_dump和marshal_load方法? 即使是一个简单的例子也可以。 当marshal_load时,它如何“知道”要创建哪种类型的对象? 如果文件中有多个相同类型的对象,你怎么知道哪个是哪个? 我显然很困惑…… 如果我有一个表示图像的对象,是否有不同的方法将其写入磁盘? 我的具体问题是: 它有点复杂,因为我没有我希望序列化的对象的源代码。 我正在研究游戏引擎的mod(使用RGSS2游戏库的RPG Maker VX)。 有一个名为Bitmap的类属于(闭源)API。 我想在游戏之间保存这个对象/图像,所以我需要将它序列化为保存文件。 我不是ruby专家,但我知道我可以定义两个方法( marshal_dump和marshal_load ),当我尝试序列化对象时,它将由“Marshal”模块调用。 问题是我不知道如何实现所需的两种方法。 我实际上可以把它们留作空方法,它似乎工作,但实际上处理了对象并且图像数据消失了。 除此之外,我不明白它在内部做了什么,显然创建空方法是错误的。 所以有人能告诉我这些东西在内部如何运作? 我认为这有助于我解决我的问题。 除此之外,还有其他类型的图像格式,我可以使用它,我可以保存到文件,避免自己的序列化?