Mam złożoną strukturę danych, taką jak: OrderedHash, klucze to daty, a wartości to uporządkowane haszy, które przechowują liczby całkowite z kluczami łańcuchowymi. Muszę je zserializować, aby przechowywać w db. Ale po to_yaml/YAML.load dane czasami ulegają uszkodzeniu — niektóre skróty drugiego poziomu są zastępowane przez skróty pierwszego poziomu lub odwrotnie. Czasami jednak nie jest zepsuty.

Reprezentacja yaml wygląda tak

- 2011-07-10: !omap 
    - 00:00-01:00: 0
    - 01:00-02:00: 0
    - 02:00-03:00: 0
    - 03:00-04:00: 0
    - 04:00-05:00: 0
    - 05:00-06:00: 0
    - 06:00-07:00: 0
    - 07:00-08:00: 0
    - *id010
    - 09:00-10:00: 0
    - 10:00-11:00: 0
    - 11:00-12:00: 0
    - 12:00-13:00: 0
    - 13:00-14:00: 0
    - 14:00-15:00: 0
    - 15:00-16:00: 0
    - 16:00-17:00: 0
    - 17:00-18:00: 0
    - 18:00-19:00: 0
    - 19:00-20:00: 0
    - 20:00-21:00: 0
    - 21:00-22:00: 0
    - 22:00-23:00: 0
    - 23:00-23:59: 0

Ta część *id010/&id010 jest losowo wstawiana w różne miejsca kodu yaml. Myślę, że to jest przyczyną błędu.

Czy ktoś ma pojęcie, co jest nie tak z serializacją yaml? ruby 1.8.6, aktualizacja do 1.9 nie wchodzi w grę :(

1
Alexander 28 lipiec 2011, 16:57

2 odpowiedzi

Najlepsza odpowiedź

Bardzo możliwe, że jest błąd. Uważam, że silnik YAML, którego używa Ruby 1.8, nazywa się Syck, a ten kod został stworzony przez _why wiele lat temu. Od tego czasu kod nie był właściwie utrzymywany.

Ruby 1.9 ma używać nowego silnika o nazwie Psych, ale nie jestem pewien, na ile jest on kompatybilny z Ruby 1.8.

Na Github znalazłem też inną alternatywę, która wygląda na to, że warto spróbować dla Ciebie:
https://github.com/cesare/ruby-libc-libyaml

Syck (możesz wypróbować tę wersję, ponieważ wygląda na to, że jest częściowo konserwowana): https://github.com/indeyets/syck

Psych (możesz też spróbować sprawdzić, czy działa w wersji 1.8):
https://github.com/tenderlove/psych


EDYTUJ

Może JSON mógłby być również dla Ciebie alternatywą? Spójrz na metodę to_json i zobacz, czy można ją wykorzystać do twoich celów i być może w ten sposób obejść problemy YAML.

0
Casper 28 lipiec 2011, 20:09
Wygląda na to, że ten błąd został naprawiony w ruby ​​1.8.7. Spróbuję też JSON, dziękuję!
 – 
Alexander
28 lipiec 2011, 21:00

Uważam, że id010 jest tam, ponieważ możesz mieć jakąś strukturę rekurencji/samoodniesienia i to jest sposób na radzenie sobie z tym.

0
mcr 16 lipiec 2014, 01:31