反序列化嵌套对象结构时的Ruby YAML问题

反序列化嵌套对象结构时的Ruby YAML问题,ruby,serialization,yaml,Ruby,Serialization,Yaml,我有3个类具有以下关系: 战场拥有一系列团队 战斗队有一组成员,并有一个对战场的引用 捷豹是战斗团队的成员,并对其有参考价值 如果我序列化/反序列化捷豹和战列队,就没有问题了。该问题发生在序列化/反序列化战场时 序列化它会产生适当的结果,但反序列化它会使战斗队中的成员变为零 让我告诉你: >> j = Jaguar.new => #<Jaguar:0xa2221f8 @vitality=nil, @spirituality=nil, @log=nil, @name=nil

我有3个类具有以下关系:

战场拥有一系列团队

战斗队有一组成员,并有一个对战场的引用

捷豹战斗团队的成员,并对其有参考价值

如果我序列化/反序列化捷豹和战列队,就没有问题了。该问题发生在序列化/反序列化战场时

序列化它会产生适当的结果,但反序列化它会使战斗队中的成员变为零

让我告诉你:

>> 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
>j=Jaguar.new
=> #
#战斗队可能有许多成员:
>>t=战斗队
=> #
#一个战场可能有许多团队:
>>b=战场。新
=> #
#向团队中添加成员
>>t.add_成员(j)
=>#b.添加团队(t)
=> #
#序列化和反序列化jaguar对象(按预期工作):
>>YAML::将j.加载到_YAML
=>###YAML::load(b.to#u YAML)。团队[0]。成员
=>零
#这是生成的yaml,看起来不错,成员在那里:
>>把b.放到u yaml
---&id002!ruby/object:战场
小组:
-&id001!ruby/object:BattleTeam
战场:*id002
死亡成员:[]
成员:
- !ruby/对象:捷豹
战斗队:*id001
日志:
姓名:
灵性:
活力:
=>零

有人知道这有什么问题吗?

我真的不太了解YAML或序列化/反序列化。。 但是你看:

把b.放到u yaml ---&id002!ruby/object:战场 小组: -&id001!ruby/object:BattleTeam 战场:*id002 死亡成员:[]

成员: - !ruby/对象:捷豹 战斗队:*id001 日志: 姓名: 灵性: 活力: =>零

为什么战场和战斗队看起来像这样:

--- &id002 !ruby/object:Battlefield 
- &id001 !ruby/object:BattleTeam 
  - !ruby/object:Jaguar 
捷豹看起来像这样:

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

身份证好像不见了

请不要发布完整的程序。大多数人都不想整天回答你的问题。试着找出最小的例子,它仍然显示症状。然后我们可以试着帮助您了解,为什么ruby的工作方式与您期望的不同。事实上,它并不是完整的程序。我遗漏了类定义。我可以提供一个失败的最简单的例子:一个嵌套结构,有2层嵌套,这就是为什么需要3个不同的实例。它不会因为只有2个而失败。我不知道如何使它更简单。我们需要简单的类定义来测试它。是的,这是一个bug,有人复制了它。如果你对复制感兴趣,我会发布代码。啊,不,是正确的。发生这种情况是因为没有其他对象引用捷豹实例,因此它不需要id。它是在“战斗队”实例的“内部”创建的。