Сериализация объекта в JSON, XML, YAML? - PullRequest
7 голосов
/ 27 октября 2011

Я задал предыдущий вопрос о сериализации и валидации.Кто-то упомянул об использовании гема JSON, который позволяет мне рассказать моему объекту о том, как сериализовать с помощью метода to_json, однако Ruby, кажется, действительно выполняет МНОГИЕ сложные вещи, однако, с другой стороны, некоторые действительно простые вещи кажутся довольно сложными,Сериализация - одна из тех вещей.

Я хочу выяснить, есть ли способ получить чистый объект:

class CleanClass
    attr_accessor :variable1
    attr_accessor :variable2
    attr_accessor :variable3
end

cleanObject = CleanClass.new

В идеале, я не хочу испачкать модель,Я просто хочу передать его что-то и сказать ему, каким должен быть тип вывода, и позволить ему работать магически.

Примером может быть что-то вроде:

jsonOutput = MagicSerializer::Json.Serialize(cleanObject)
xmlOutput = MagicSerializer::Xml.Serialize(cleanObject)
yamlOutput = MagicSerializer::Yaml.Serialize(cleanObject)

revertedJsonObject = MagicSerializer::Json.Unserialize(jsonOutput)
revertedXmlObject = MagicSerializer::Xml.Unserialize(xmlOutput)
revertedYamlObject = MagicSerializer::Yaml.Unserialize(yamlOutput)

Я хочу передать что-либо объекту и получить выводимые строки, а затем иметь возможность преобразовать его обратно.

Я знаю, что ActiveModel имеет функцию сериализации, но мне нужно испачкать мой класс, чтобы сделать это, и я нене хочу менять модель, если это возможно.ActiveSupport, кажется, удовлетворяет критериям JSON, так как я могу просто назвать это, и он возьмет объект и выплеснет JSON, но я хотел бы поддерживать другие типы.

Любая дополнительная информация будет полезна!

Ответы [ 3 ]

12 голосов
/ 27 октября 2011

Ruby имеет встроенную автоматическую сериализацию / десериализацию в двоичные и yaml.

YAML:

require 'yaml'
serialized = CleanClass.new.to_yaml
object = YAML.load(serialized)

Маршал:

serialized = Marshal.dump(CleanClass.new)
object = Marshal.load(serialized)
1 голос
/ 27 октября 2011

Сделайте так, чтобы ваш магический метод сериализации испортил вам объект; эмиссия может происходить для каждого объекта.

Или грязный на уровне вашего класса.

В любом случае, ваш основной код не видит его.

1 голос
/ 27 октября 2011

Для JSON и YAML это кажется довольно простым, поскольку они будут только обертками для методов to_yaml и to_json (или YAML.load и from_json соответственно)

Для JSON вы должны будете обернуть собственные классы вокруг типов ядра (или других типов, которые реализуют to_json), например. сначала реализуйте метод to_hash, который затем можно преобразовать в json.

XML намного сложнее из-за аспекта иерархии, вам придется стандартизировать его, но на самом деле я не понимаю из вашего объяснения, что не так с основными to_... методами. На самом деле это соглашение, которое мы используем в Ruby. Если вы обеспокоены загрязнением моделей, вы можете поместить эти методы в модуль и включить модуль в класс.

module Foo
  def to_serialized_type
   ...
  end
end
class CleanClass
  include Foo
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...