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