Rubyでは、「to_yaml
」メソッドの出力をファイルに保存することによって、オブジェクトをYAMLドキュメントに転送、つまりシリアル化することができます。その後、YAML::load
メソッドを使用して、このYAMLファイルを再度読み取る、つまり逆シリアル化することができます。さらに、基になるクラス/オブジェクトのすべてのメンバーにフルアクセスできます。外部ソースからYAMLドキュメントをどのように非直列化し、クラスメンバーにフルアクセスできますか?
これはすべて、Rubyを単一のプラットフォームとして使用している限り有効です。 Javaでオブジェクトをシリアル化してRubyでデシリアライズすると、NoMethodError
例外のためにオブジェクトにアクセスできなくなりました。これは、オブジェクト/ローカル・データ型の名前が異なるシステムの名前に起因するためです。
考えるとRubyのクラス "自動車":
# A simple class describing a car
#
class Car
attr :brand, :horsepower, :color, :extra_equipment
def initialize(brand, horsepower, color, extra_equipment)
@brand = brand
@horsepower = horsepower
@color = color
@extra_equipment = extra_equipment
end
end
シンプルインスタンスの作成:
# creating new instance of class 'Car' ...
porsche = Car.new("Porsche", 180, "red", ["sun roof", "air conditioning"])
次の出力でporsche.to_yaml
結果の呼び出し:
--- !ruby/object:Car
brand: Porsche
color: red
extra_equipment:
- sun roof
- air conditioning
horsepower: 180
は私がで直列化復元をテストしますYAML出力をロード:
# reading existing yaml file from file system
sample_car = YAML::load(File.open("sample.yaml"))
puts sample_car.brand # returns "Porsche"
これは期待通りに動作しますが、今度は、YAMLドキュメントが別のシステムによって生成され、YAML-準拠オブジェクトの記述を有するが、ルビーへの参照を欠いたと仮定する、「!Car
」、代わりに「!ruby/object:Car
」の:
--- !Car
brand: Porsche
color: red
extra_equipment:
- sun roof
- air conditioning
horsepower: 180
このコード:
# reading existing yaml file from file system
sample_car = YAML::load(File.open("sample.yaml"))
puts sample_car.brand # returns "Porsche"
戻りこの例外:
/path/yaml_to_object_converter.rb.rb:27:in `<main>':
undefined method `brand' for #<YAML::DomainType:0x9752bec> (NoMethodError)
「外部」YAML文書で定義されたオブジェクトを処理する方法はありますか? IRBシェル内sample_car
があると評価私にとって
多分これは役立ちます。http://blog.bytemine.net/2009/12/07/yaml-in -java-and-ruby-welcome-yamlbeans –
(タイトルの)「クラスメンバー」はJava用語ですか? –
@Andrew:私はこれがむしろJavaの用語であり、このRubyの文脈では少し不正確であると認めます。私はクラス変数とクラスメソッドを意味しました。 – Bionicman303