Проблема Ruby YAML при десериализации структуры вложенных объектов - PullRequest
1 голос
/ 26 октября 2009

У меня есть 3 класса, которые имеют следующие отношения:

Поле битвы имеет множество команд.

BattleTeam имеет массив участников и ссылку на Battlefield .

Jaguar является членом BattleTeam и имеет ссылку на него.

Если я сериализую / десериализую Jaguar и до BattleTeam, проблем не будет. Проблема возникает при сериализации / десериализации поля битвы.

Сериализация этого дает соответствующий результат, но десериализация превращает участников в BattleTeam в ноль.

Позвольте мне показать вам:

>> j = Jaguar.new
=> #<Jaguar:0xa2221f8 @vitality=nil, @spirituality=nil, @log=nil, @name=nil>

#A battleteam might have many members:
>> t = BattleTeam.new
=> #<BattleTeam:0xa21fafc @members=[], @dead_members=[]>

#A battlefield might have many teams:
>> b = Battlefield.new
=> #<Battlefield:0xa2075d8 @teams=[]>

#Add a member to the team
>> t.add_member(j)
=> #<BattleTeam:0xa21fafc @members=[#<Jaguar:0xa2221f8 @vitality=nil, @spirituality=nil, @log=nil, @name=nil, @battle_team=#<BattleTeam:0xa21fafc ...>], dead_members[]

#Add a team to the battlefield
>> b.add_team(t)
=> #<Battlefield:0xa2075d8 @teams=[#<BattleTeam:0xa21fafc @members=[#<Jaguar:0xa2221f8 @vitality=nil, @spirituality=nil, @log=nil, @name=nil, @battle_team=#<BattleTeam:0xa21fafc ...>>], @dead_members=[], @battlefield=#<Battlefield:0xa2075d8 ...>>]>

#Serialize and deserialize the jaguar object (it works as expected):
>> YAML::load j.to_yaml
=> #<Jaguar:0xa1e3cdc @vitality=nil, @spirituality=nil, @log=nil, @name=nil, @battle_team=#<BattleTeam:0xa1e4204 @members=[#<Jaguar:0xa1e3cdc ...>], dead_members[], battlefield#<Battlefield:0xa1e4038 @teams=[#<BattleTeam:0xa1e4204 ...>]

#Serialize and deserialize the battle team object (it words as expected):
>> YAML::load t.to_yaml
=> #<BattleTeam:0xa1d0664 @members=[#<Jaguar:0xa1cfee4 @vitality=nil, @spirituality=nil, @log=nil, @name=nil, @battle_team=#<BattleTeam:0xa1d0664 ...>], dead_members[], battlefield#<Battlefield:0xa1d0470 @teams=[#<BattleTeam:0xa1d0664 ...>]

#Serialize and deserialize the battle team object
#(here the @members array is deserialized as nil, this is not expected!):
>> YAML::load b.to_yaml
=> #<Battlefield:0xa1c370c @teams=[#<BattleTeam:0xa1c33b0 @members=nil, @dead_members=[], @battlefield=#<Battlefield:0xa1c370c ...>]

>> YAML::load(b.to_yaml).teams[0].members
=> nil


#Here is the generated yaml, it looks right, the member is there:
>> puts b.to_yaml
--- &id002 !ruby/object:Battlefield 
teams: 
- &id001 !ruby/object:BattleTeam 
  battlefield: *id002
  dead_members: []

  members: 
  - !ruby/object:Jaguar 
    battle_team: *id001
    log: 
    name: 
    spirituality: 
    vitality: 
=> nil

Кто-нибудь знает, что с этим не так?

1 Ответ

0 голосов
/ 17 декабря 2009

Я действительно не знаю много о YAML или сериализации / десериализации. Но посмотрите:

ставит b.to_yaml --- & id002! ruby ​​/ object: Battlefield команды: - & id001! ruby ​​/ object: BattleTeam поле битвы: * id002 dead_members: []

Участники: -! Рубин / объект: Ягуар Battle_team: * id001 журнал: название: духовность: жизнеспособность: => ноль

Почему поля битвы и битва выглядят так:

--- &id002 !ruby/object:Battlefield 
- &id001 !ruby/object:BattleTeam 

И Ягуар выглядит так:

  - !ruby/object:Jaguar 

Идентификатор, похоже, отсутствует ...?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...