問題タブ [psych]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
ruby - Psych でクラスを逆シリアル化するにはどうすればよいですか?
Psych でデシリアライズして、クラス オブジェクトなどの既存のオブジェクトを返すにはどうすればよいですか?
クラスのシリアル化を行うには、次のことができます
しかし、それを実行しようとするとPsych.load
、String クラスではなく匿名クラスが取得されます。
通常の逆シリアル化方法は ですがObject#init_with(coder)
、それは既存の匿名クラスの状態を変更するだけですが、私は String クラスが必要です。
Psych::Visitors::ToRuby#visit_Psych_Nodes_Scalar(o)
で既存のオブジェクトを変更するのではなくinit_with
、正しいオブジェクトが最初に作成されるようにする場合があります (たとえば、Complex(o.value)
複素数を逆シリアル化するための呼び出し)。
低レベルまたは中レベルの放射で作業する運命にあるのでしょうか、それとも何か不足していますか?
バックグラウンド
プロジェクトについて、なぜクラスが必要なのか、なぜ (デ) シリアル化が必要なのかを説明します。
計画
Small Eigen Collider は、Ruby が実行するランダムなタスクを作成することを目的としています。最初の目的は、Ruby のさまざまな実装 (たとえば、Rubinius と JRuby) が同じランダムなタスクを与えられたときに同じ結果を返すかどうかを確認することでしたが、Rubinius と YARV をセグメンテーション違反する方法を検出するのにも適していることがわかりました。
各タスクは、次の要素で構成されています。
はreceiver
ランダムに選択されたオブジェクト、method_name
はランダムに選択されたメソッドの名前、 は*parameters
ランダムに選択されたオブジェクトの配列です。&block
はあまりランダムではありません。基本的には と同等{|o| o.inspect}
です。
たとえば、レシーバーが "a"、method_name が :casecmp、パラメーターが ["b"] の場合、呼び出します。
これは(ブロックは無関係であるため)と同等です
Small Eigen Collider はこのコードを実行し、これらの入力と戻り値をログに記録します。この例では、Ruby のほとんどの実装は -1 を返しますが、ある段階で Rubinius は +1 を返しました。(私はこれをバグhttps://github.com/evanphx/rubinius/issues/518として提出し、Rubinius のメンテナーがバグを修正しました)
クラスが必要な理由
Small Eigen Collider でクラス オブジェクトを使用できるようにしたいと考えています。通常、これらはレシーバーですが、パラメーターの 1 つになることもあります。
たとえば、YARV をセグメンテーション違反にする方法の 1 つは、次のようにすることです。
この場合、レシーバーはクラス オブジェクト Thread であり、パラメーターは [nil] です。(バグレポート: http://redmine.ruby-lang.org/issues/show/4367 )
(デ)シリアライズが必要な理由
Small Eigen Collider は、いくつかの理由でシリアル化が必要です。
1 つは、乱数ジェネレーターを使用して一連のランダムなタスクを毎回生成するのは実用的ではないということです。JRuby には異なる乱数ジェネレーターが組み込まれているため、同じ PRNG シードが与えられたとしても、YARV に異なるタスクを与えます。代わりに、ランダムなタスクのリストを 1 回作成し (ruby bin/small_eigen_collider の最初の実行)、最初の実行でタスクのリストを tasks.yml にシリアル化し、その後のプログラムの実行 (別の方法を使用) を行います。 Ruby 実装) は、その tasks.yml ファイルを読み込んで、タスクのリストを取得します。
シリアル化が必要なもう 1 つの理由は、タスクのリストを編集できるようにしたいからです。セグメンテーション違反につながるタスクの長いリストがある場合、セグメンテーション違反を引き起こすのに必要な最小限のリストに減らしたいと考えています。たとえば、次のバグ でhttps://github.com/evanphx/rubinius/issues/643、
それ自体ではセグメンテーション違反は発生しません。
しかし、2つを組み合わせると、そうなりました。しかし、私は何千ものタスクから始めたので、それらの 2 つのタスクだけに戻す必要がありました。
このコンテキストでは、既存のクラス オブジェクトを返す逆シリアル化は理にかなっていますか、それとももっと良い方法があると思いますか?
ruby-on-rails - Rails 3 - 「Yaml を解析できませんでした」
何を間違えたのかわからない。「rails c」を実行しようとしましたが、エラーが発生します。10分前に機能していました。:\
ruby - Ruby 1.9.2-rbenvを介したp290は、psych-1.2.1から警告を生成します:VERSIONおよびLIBYAML_VERSION
rubyを実行すると、次の警告が表示されます。
私はグーグルを試してみましたが、それが私のシステムに固有であると思わせる解決策を見つけることができるようです。これを修正する方法はありますか?
ruby-on-rails - Psych は単純なキーを解析できません: 値のペア、Ruby、Yaml
ruby 1.9.2-p290 と rails 3.1.3 でいくつかの構文解析の問題が発生します。
私の YAML ファイルは次のようになります。
database.yml や locale ファイルなど、他の YAML ファイルは正常に解析されます。これだけです。理由についてのアイデアはありますか?
ruby-on-rails-3 - RailsイニシャライザでYAML.loadが返らない
Rails 3.1 アプリの初期化中に yaml 構成ファイルをロードしようとしていますが、YAML.load の呼び出しが返されません。これが私の初期化ファイルです:
そして、ここに私のstripe.ymlファイルがあります:
なんらかの理由で、YAML.load
コールは返されません。スタック トレースを実行すると、syck.rb の 135 行目でスタックしているように見えます。興味深いのは、アプリが壊れるまで放置する時間が長いほど、135 行目の呼び出しが多くなるということです。
Syck を使用する代わりに Psych を明示的に使用しようとしましたが、うまくいきませんでした。(それもぶら下がってしまいます。)
serialization - シリアライズとデシリアライズ
サンプルが埋め込まれたアクティブなレコード クラスがあります。
サンプルをシリアル化してデータベースに保存したいのですが、GSL::Vector (gsl gem から) には to_yaml メソッドがありません。Rails 3.2 のデフォルトの YAML エンジン Psych を使用する場合、Sample に to_yaml と YAML.quick_emit を定義することは明らかに非推奨です。
このオブジェクトをシリアライズおよびデシリアライズする方法はありますか?
ruby - ruby で Psych にインラインモードを使用するように指示する方法はありますか?
環境: ruby1.9.3 , psych(任意のバージョン) ex:
実際の結果:
出力を期待します:
ruby - リテラルスカラースタイルを使用してYAMLで文字列をダンプする方法は?
フォーマットを維持しながら、rubyでPsychを使用してYAMLにダンプしたいフォーマットされたデータ(JSONなど)の大きな文字列があります。
基本的に、JSONをリテラルスタイルを使用してYAMLに表示したいと思います。
ただし、使用するYAML.dump
場合はリテラルスタイルを使用しません。私はこのようなものを手に入れます:
必要なスタイルでスカラーをダンプするようにPsychに指示するにはどうすればよいですか?
解決:
ここで拡張しているソリューションを提供してくれたAaronPattersonに大いに感謝します:https ://gist.github.com/2023978
少し冗長ですが、その要点は、YAMLのリテラルスタイルを使用して出力されるように、rubyの特定の文字列にタグを付けるための実用的な方法です。
ruby-on-rails-3 - Ruby 1.9.2 で yamler を Rails 3.2 の Psych に設定できない
Ruby 1.9.2 で Rails 3 を読みました。Psych はデフォルトの yaml パーサーです。私のためではありません。それはまだ病気です。やっている
いろいろなところで説明されているように動作しません。ヤムラーはまだ病気です。それで、どこかでリセットされたようです。
yamler を Psych に設定するにはどうすればよいですか?