尝试枚举反序列化列表会引发异常

时间:2013-07-21 20:57:59

标签: c#-4.0 exception protobuf-net

我知道这个例外已被解决了十亿次,但我的情况略有不同(我认为)。

无论如何,我使用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);
    }

非常感谢这个问题。

1 个答案:

答案 0 :(得分: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);
}

再次感谢您耐心地指出了显而易见的事实。