Есть ли Ruby-эквивалент для сериализаторов .NET DataContract? - PullRequest
1 голос
/ 01 марта 2010

Я использовал WCC DataContract и DataContractSerializer для чтения / записи объектов в файлы XML. Мы хотим перейти на использование версии Ruby on Rails, и я хотел выяснить, что я мог бы использовать. У нас есть объекты, которые имеют такие атрибуты (это просто примеры, а не точные объекты):

[DataContract]
public class City
{
    [DataMember]
    public string Name { get; set; }

    [DataMember]
    public string Location { get; set; }
}

[DataContract]
public class Person
{
    [DataMember]
    public string Name { get; set; }

    [DataMember]
    public City Home {get; set; }

    // returns true if the city is near me
    public bool NearMe(City myCity) { // insert code to compare cities }
}

и код для чтения в объектах:

DataContractSerializer ds = new DataContractSerializer(typeof(Person));
using (Stream s = File.OpenRead("person1.xml"))
{
     Person p = (Person) ds.ReadObject(s);
}

Каков эквивалентный формат для того же самого в Ruby / Rails? Как мне определить объекты? Какой метод я могу прочитать их из файла XML? Я видел, что я могу попытаться определить все как модель, а затем создать внутреннюю базу данных для каждого объекта. Есть ли в любом случае сделать это без создания всех таблиц БД, так как нам не нужны БД для этого приложения, а просто читают статический набор объектов из файлов XML.

1 Ответ

1 голос
/ 01 марта 2010

Если вам требуется поддержка XML-схемы, исходящей от WCF, и вам не нужна база данных, поддерживающая ваше приложение, вы можете посмотреть на happy mapper:

http://railstips.org/blog/archives/2008/11/17/happymapper-making-xml-fun-again/

Это отличный способ сериализации в и из XML в ruby.

Ваш пример будет выглядеть примерно так:

class City
  include HappyMapper
  element :name, :tag => "Name"
  element :location, :tag => "Location"
end 

class Person
  include HappyMapper
  element :name, :tag => "Name"
  has_one :city, :tag => "City"
end

Затем вы бы проанализировали xml, выполнив:

people = Person.parse(xml_string)
people.each do |person|
  puts person.name
end

Надеюсь, это поможет ...

...