2013-07-21 33 views
1

我知道这个异常已被解决像十亿次,但我的情况稍有不同(我认为)。试图列举一个反序列化的列表抛出一个异常

无论如何,我使用ProtoBuf-Net来保存和加载对象。我已经得到了我想要反序列化对象的列表,但它不断地刷新说(就到这里吧):

Collection was modified; enumeration operation may not execute. 

再次,我已经看到了问喜欢这里的50倍,所以我的问题抱歉,50倍,但这里的代码:

public void Load(){ 
      using (var file = 
       File.Exists(Application.StartupPath + @"\TestFile.scn") ? 
       File.OpenRead("TestFile.scn") : 
       null){ 
       if (file != null){ 
        this._tlpGrid.Controls.Clear(); 
        this.Scenes = Serializer.Deserialize<List<GraphicsPanel>>(file); 
        foreach(GraphicsPanel gp in this._lgpScenes) 
         this.AddScene(gp); 
       } 
      } 
} 

为什么会被抛出该异常,什么是去了解这一点,如果我这样做是错误的正确方法?

编辑:它向我表明,AddScene方法正在修改列表。这是正确的: 原文:

public void AddScene(GraphicsPanel Scene){ 
     this._tlpGrid.Controls.Add(Scene); 
     this.Scenes.Add(Scene); 
    } 

修改:

public void AddScene(GraphicsPanel Scene){ 
     this._tlpGrid.Controls.Add(Scene); 
     if (!this.Scenes.Contains(Scene)) 
      this.Scenes.Add(Scene); 
    } 

的问题已经回答了,非常感谢。

+0

AddScene()是做什么的? – Ric

+3

我假设'AddScene'正在修改'_lgpScenes',在列举它的时候你不能这样做。 – Lee

+0

AAAAHGH你是对的!编辑代码来反映。 – Will

回答

1

很明显,问题在于我调用修改列表的方法是在迭代列表时修改列表。这应该是显而易见的,但我完全错过了它。谢谢你给我指出,李。 的方法抛出异常的代码:

public void Load(){ 
      using (var file = 
       File.Exists(Application.StartupPath + @"\TestFile.scn") ? 
       File.OpenRead("TestFile.scn") : 
       null){ 
       if (file != null){ 
        this._tlpGrid.Controls.Clear(); 
        this.Scenes = Serializer.Deserialize<List<GraphicsPanel>>(file); 
        foreach(GraphicsPanel gp in this._lgpScenes) 
         this.AddScene(gp); 
       } 
      } 
} 

这是造成问题(之前)的方法:

public void AddScene(GraphicsPanel Scene){ 
    this._tlpGrid.Controls.Add(Scene); 
    this.Scenes.Add(Scene); 
} 

而经过:

public void AddScene(GraphicsPanel Scene){ 
    this._tlpGrid.Controls.Add(Scene); 
    if (!this.Scenes.Contains(Scene)) 
     this.Scenes.Add(Scene); 
} 

再次感谢耐心指出明显的。

相关问题