Postawy YAML’a, czyli łatwe serializowanie i deserializowanie obiektów 3

Posted by wijet
on Wednesday, July 11

Obsługa YAML’a jest banalnie prosta i w zasadzie ogranicza się do wczytania lub zapisania danych.
Zapisujemy zawartość zmiennej config do pliku.

require 'yaml'
config = {
 :max_users=>200,
 :db=>
    {:host=>"localhost",
      :user_name=>"shop",
      :db_name=>"shop",
      :password=>"shop123"
    },
 :timeout=>10
}
 
File.open("config.yaml","w") { |file| YAML.dump(config,file) }

Dane można konwertować to formatu YAML również za pomocą metody to_yaml, która po załadowaniu biblioteki yaml jest dodawana do obiektów w programie.
Plik config.yaml:

---
:max_users: 200
:db:
    :host: localhost
    :user_name: shop
    :db_name: shop
    :password: shop123
:timeout: 10

Jak widać format pliku jest bardzo czytelny i łatwy do edycji. Wczytywanie danych z pliku również jest proste.

require 'yaml'
config = YAML.load_file("config.yaml")

Warto wspomnieć że za pomocą YAML’a możemy zachować dane z dowolnego obiektu, a gdy zajdzie taka potrzeba zainicjować obiekt tymi danymi.

Kawałek przykładu:

require 'yaml'
class Student
  def initialize(id,name,last_name)
    @id, @name, @last_name = id, name,last_name
    @marks = {}
  end
  def add_mark(subject,mark)
    @marks[subject] = mark
  end
end
 
o1 = Student.new(32124,"Tomek","Kowalski")
o1.add_mark("Matematyka",3)
o1.add_mark("Fizyka",4)
o1.add_mark("Biologia",5)
#zachowujemy zawartość obiektu
File.open("student.yaml","w") { |file| file.write(o1.to_yaml) }
#tworzymy nowy obiekt inicjalizując go zachowanymi danymi
o2 = YAML.load_file("student.yaml")

Comments

Leave a response

  1. salciarzMarch 09, 2008 @ 09:24 PM

    Chciałem wykorzystać YAMLa jako bazę (‘title’ => [‘genre’, ‘year’, ‘itd’]), ale ciągle coś bym dodawał, a YAML IMHO się do tego zbytnio nie nadaje. Moje pytanie: czy dobrym rozwiązaniem było by po prostu jako bazę mieć zwykły plik tekstowy, czy istnieje jakieś bardziej optymalne rozwiązanie? Baza będzie miała około 2-3 tysiąca tablic asocjacyjnych (w końcowej fazie) i będzie odpytywana w celu usunięcia duplikatów za każdym razem. Dzięki za ewentualne pomysły. Czytelnik czekający na kolejne wpisy :)

  2. wijetMarch 15, 2008 @ 06:48 PM

    Nie spotkalem sie jeszcze z takimi bibliotekami ktore pozwalaja uzywac YAML’a jako baze. Nalezalo by sie zastanowic czy potrzebujesz latwo czytac te pliki ? (tzn tak za pomoca edytora) bo jesli nie to idealny wydaje sie sqlite

  3. salciarzMarch 16, 2008 @ 12:26 PM

    Zmylił mnie po prostu wpis sztywnego: http://www.stifflog.com/pl/index.php/2006/02/19/ruby-wprowadzenie-czesc-4-nareszcie-cos-powaznego/ YAML jako baza, bo czy spis wszystkich zadan uzytkownika nie sa w “bazie”?

Comment