Tag: 序列化

如何使用JSON进行Ruby对象序列化

我有一个像这样的简单容器类的结构(在伪ruby中): class A attr_reader :string_field1, :string_field2 … end class B attr_reader: int_field3, :string_field4 … end # C includes an instance of A and B class C attr_reader: :a_instance, :b_instance … end 是否有简单的方法在Ruby中将其/序列化为JSON? 或者我应该为每个类制作嵌套的序列化方法,如本例所示 ? 编辑: 在我的特定场景中,我想将一些JSON数据发送到运行Ruby的服务器,这将提取数据并采取相应的行动。 JSON的发送者不一定是Ruby进程,但可能是其他系统的后端。 (虽然在我的测试工具中是Ruby)。 因此,我不需要JSON采用某种“特定于Ruby”的格式,我只是假设如果它实际上是内置于Ruby的话会更容易。

如何在Ruby中编组lambda(Proc)?

Joe Van Dyk 询问了Ruby邮件列表 : 嗨, 在Ruby中,我猜你不能编组一个lambda / proc对象,对吗? 在lisp或其他语言中这可能吗? 我想做什么: l = lamda { … } Bj.submit “/path/to/ruby/program”, :stdin => Marshal.dump(l) 所以,我向BackgroundJob发送一个lambda对象,其中包含要执行的操作的上下文/代码。 但是,猜测这是不可能的。 我最终编组了一个普通的ruby对象,其中包含程序运行后要执行的操作的说明。 乔

如何使用TCPServer序列化对象?

为了加快我的链中特定脚本的频繁重复运行,我开始序列化到磁盘自定义对象,否则需要花费太多时间来创建聚合。 使用内置的Yaml和/或Marshal。 Yaml序列化为看似健康的文本文件,但在尝试反序列化时会产生以下错误: b2 = YAML::load(File.open(“browserObj.yaml”, ‘r’)) Syck::TypeError: Invalid Regular expression: “/\\A\\s*\n ([a-zA-Z][-+.a-zA-Z\\d]*): …and many more strange lines 但是,即使尝试通过Marshal错误保存到二进制文件: puts File.open(“browserObj.bin”, ‘w’).write Marshal::dump($browser) TypeError: can’t dump TCPServer # Marshal::dump($browser, File.open(“browserObj.bin”, ‘wb’)) # same error 故意不在最后做$browser.close我可以选择在我的Ruby脚本生命周期之后保持这个TCPServer活着并运行。 有什么想法我怎么能逃脱这个? 我保证成功重新加载以仔细检查任何套接字/内部对象的有效性,并且如果必须的话,只需重新初始化一个全新的对象。

你如何串行化/序列化Ruby代码?

我希望能够在我的Ruby代码中编写lambda / Proc,将其序列化以便我可以将其写入磁盘,然后再执行lambda。 有点像…… x = 40 f = lambda { |y| x + y } save_for_later(f) 后来,在一个单独的Ruby解释器运行中,我希望能够说…… f = load_from_before z = f.call(2) z.should == 42 Marshal.dump不适用于Procs。 我知道Perl有Data :: Dump :: Streamer ,在Lisp中这很简单。 但有没有办法在Ruby中做到这一点? 换句话说,以后会save _ for _ later实现什么? 编辑 : 我的答案很好,但它不会关闭自由变量(如x )并将它们与lambda序列化。 所以在我的例子中…… x = 40 s = save_for_later { |y| x + […]

在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文档,但我无法真正理解它。

Ruby on Rails高级JSON序列化

我想在我的rails应用程序中通过JSON呈现所有文章的索引以及完整的文章,但是我在弄清楚如何做到这一点时遇到了一些麻烦。 这是我的控制器: if params[:id] @article = Article.find(params[:id]) else @article = Article.published.not_draft.by_recent.first end respond_to do |format| format.js { render :json => @article.to_json( :except => [ :created_at, :updated_at, :draft, :id, :publish ], :include => { :comments => { :only => [:body] } }), :callback => params[:callback]} end 我想在响应中做的是添加所有文章的索引,如下所示: @index = Article.find(:all, :select => ‘id, title’) 我能够做到的唯一方法是将索引和文章放入哈希或数组中,然后将其放入JSON中。 @response […]

在嵌套对象中使用自定义to_json方法

我有一个使用Ruby标准库中的Set类的数据结构。 我希望能够将我的数据结构序列化为JSON字符串。 默认情况下,将序列化设置为数组: >> s = Set.new [1,2,3] >> s.to_json => “[1,2,3]” 在尝试反序列化之前哪个是好的。 所以我定义了一个自定义的to_json方法: class Set def to_json(*a) { “json_class” => self.class.name, “data” => { “elements” => self.to_a } }.to_json(*a) end def self.json_create(o) new o[“data”][“elements”] end end 哪个效果很好: >> s = Set.new [1,2,3] >> s.to_json => “{\”data\”:{\”elements\”:[1,2,3]},\”json_class\”:\”Set\”}” 直到我把Set放入哈希或其他东西: >> a = { ‘set’ => s […]

如何将对象保存到文件?

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