В Ruby любой объект можно перенести, т.е. сериализовать, в документ YAML, сохранив выходные данные метода "to_yaml
" в файл.После этого этот файл YAML можно снова прочитать, т. Е. Десериализовать, используя метод YAML::load
.Более того, у каждого есть полный доступ ко всем членам базового класса / объекта.
Все это действует, пока я использую Ruby в качестве единой платформы.После сериализации объектов в Java и десериализации их в Ruby я больше не могу получить доступ к объекту из-за исключения NoMethodError
.Это связано с тем, что объекты / локальные типы данных именуются в разных системах.
Для класса Ruby "Car":
# 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 был создан другой системой, и в нем отсутствует какая-либо ссылка на Ruby, хотя в нем есть описание объекта, соответствующее yaml, "!Car
" вместо "!ruby/object:Car
":
--- !Car
brand: Porsche
color: red
extra_equipment:
- sun roof
- air conditioning
horsepower: 180
Thiscode:
# 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?