Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#未知问题_C#_Serialization - Fatal编程技术网

C#未知问题

C#未知问题,c#,serialization,C#,Serialization,你好,我试图序列化一个文件,但我有一个非常 奇怪的问题 在第一次保存时,所有变量都被正确序列化。 接下来,许多变量保持为空,其他变量保存 1°序列化代码 public void SaveMireProject(string projectName,string root_path) { BinaryFormatter bin = new BinaryFormatter(); using (FileStream _FileSt

你好,我试图序列化一个文件,但我有一个非常 奇怪的问题

在第一次保存时,所有变量都被正确序列化。 接下来,许多变量保持为空,其他变量保存

1°序列化代码

   public void SaveMireProject(string projectName,string root_path)
        {
            BinaryFormatter bin = new BinaryFormatter();

            using (FileStream _FileStream =
                    new FileStream(root_path + "\\" + projectName + ".mireprj", System.IO.FileMode.Create, FileAccess.Write))
            {
                //bin.Serialize(_FileStream, this);

                bin.Serialize(_FileStream, Tiles);
                bin.Serialize(_FileStream, project_name);
                bin.Serialize(_FileStream, root_directory);
                try { bin.Serialize(_FileStream, project_pat); } catch { }
                try { bin.Serialize(_FileStream, project_type); } catch { }
                bin.Serialize(_FileStream, Events);
                bin.Serialize(_FileStream, Light);
                bin.Serialize(_FileStream, StartupMap);
                bin.Serialize(_FileStream, startX);
                bin.Serialize(_FileStream, startY);
                _FileStream.Close();
                _FileStream.Dispose();
            }
        }
2°反序列化代码

 public void OpenProject(string filename)
        {
            BinaryFormatter bin = new BinaryFormatter();
            using (FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read))
            {

                Tiles = (List<_Tiles>)bin.Deserialize(fs);
                project_name = (string)bin.Deserialize(fs);
                root_directory = (string)bin.Deserialize(fs);

                try { Events = (List<_ev>)bin.Deserialize(fs); } catch { Events = new List<_ev>(); };

                try { Light = (List<_light>)bin.Deserialize(fs); } catch { Light = new List<_light>(); };

                try { project_pat = (string)bin.Deserialize(fs); } catch { };
                try { project_type = (string)bin.Deserialize(fs); } catch { };

                try { StartupMap = (string)bin.Deserialize(fs); } catch { };
                try { startX = (int)bin.Deserialize(fs); } catch { }
                try { startY = (int)bin.Deserialize(fs); } catch { }

            }

        }
public void OpenProject(字符串文件名)
{
BinaryFormatter bin=新的BinaryFormatter();
使用(FileStream fs=newfilestream(文件名,FileMode.Open,FileAccess.Read))
{
Tiles=(列表)bin.Deserialize(fs);
项目名称=(字符串)bin.Deserialize(fs);
根目录=(字符串)bin.反序列化(fs);
尝试{Events=(List)bin.反序列化(fs);}捕获{Events=new List();};
尝试{Light=(List)bin.反序列化(fs);}捕获{Light=newlist();};
尝试{project_pat=(string)bin.Deserialize(fs);}catch{};
尝试{project_type=(string)bin.Deserialize(fs);}catch{};
尝试{StartupMap=(string)bin.Deserialize(fs);}catch{};
尝试{startX=(int)bin.Deserialize(fs);}catch{}
尝试{startY=(int)bin.Deserialize(fs);}catch{}
}
}
以下是一些重要的变量:

StartupMap、startX和startY

将值设置为变量后, 我看到了调试器,所有的值都被存储了

我将断点设置为保存行。 我看到价值在变量中

接下来,我尝试打开现在序列化的文件, 我看到了这个

调用OpenProject方法后设置的断点

有人知道问题出在哪里吗?

您可以序列化

 try { bin.Serialize(_FileStream, project_pat); } catch { }
 try { bin.Serialize(_FileStream, project_type); } catch { }
 bin.Serialize(_FileStream, Events);
 bin.Serialize(_FileStream, Light);
你可以反序列化如下:

try { Events = (List<_ev>)bin.Deserialize(fs); } catch { Events = new List<_ev>(); };
try { Light = (List<_light>)bin.Deserialize(fs); } catch { Light = new List<_light>(); };
try { project_pat = (string)bin.Deserialize(fs); } catch { };
try { project_type = (string)bin.Deserialize(fs); } catch { };
并反序列化如下:

bin.Serialize(_FileStream, Tiles);
bin.Serialize(_FileStream, project_name);
bin.Serialize(_FileStream, root_directory);
bin.Serialize(_FileStream, project_pat); 
bin.Serialize(_FileStream, project_type);
bin.Serialize(_FileStream, Events);
bin.Serialize(_FileStream, Light);
bin.Serialize(_FileStream, StartupMap);
bin.Serialize(_FileStream, startX);
bin.Serialize(_FileStream, startY);
Tiles = (List<_Tiles>)bin.Deserialize(fs);
project_name = (string)bin.Deserialize(fs);
root_directory = (string)bin.Deserialize(fs);
project_pat = (string)bin.Deserialize(fs);
project_type = (string)bin.Deserialize(fs); 
Events = (List<_ev>)bin.Deserialize(fs);
Light = (List<_light>)bin.Deserialize(fs);
StartupMap = (string)bin.Deserialize(fs);
startX = (int)bin.Deserialize(fs);
startY = (int)bin.Deserialize(fs);
Tiles=(列表)bin.反序列化(fs);
项目名称=(字符串)bin.Deserialize(fs);
根目录=(字符串)bin.反序列化(fs);
project_pat=(字符串)bin.Deserialize(fs);
项目类型=(字符串)bin.Deserialize(fs);
事件=(列表)bin.反序列化(fs);
Light=(List)bin.Deserialize(fs);
StartupMap=(字符串)bin.Deserialize(fs);
startX=(int)bin.反序列化(fs);
startY=(int)bin.Deserialize(fs);
如果顺序正确,您可以序列化

 try { bin.Serialize(_FileStream, project_pat); } catch { }
 try { bin.Serialize(_FileStream, project_type); } catch { }
 bin.Serialize(_FileStream, Events);
 bin.Serialize(_FileStream, Light);
你可以反序列化如下:

try { Events = (List<_ev>)bin.Deserialize(fs); } catch { Events = new List<_ev>(); };
try { Light = (List<_light>)bin.Deserialize(fs); } catch { Light = new List<_light>(); };
try { project_pat = (string)bin.Deserialize(fs); } catch { };
try { project_type = (string)bin.Deserialize(fs); } catch { };
并反序列化如下:

bin.Serialize(_FileStream, Tiles);
bin.Serialize(_FileStream, project_name);
bin.Serialize(_FileStream, root_directory);
bin.Serialize(_FileStream, project_pat); 
bin.Serialize(_FileStream, project_type);
bin.Serialize(_FileStream, Events);
bin.Serialize(_FileStream, Light);
bin.Serialize(_FileStream, StartupMap);
bin.Serialize(_FileStream, startX);
bin.Serialize(_FileStream, startY);
Tiles = (List<_Tiles>)bin.Deserialize(fs);
project_name = (string)bin.Deserialize(fs);
root_directory = (string)bin.Deserialize(fs);
project_pat = (string)bin.Deserialize(fs);
project_type = (string)bin.Deserialize(fs); 
Events = (List<_ev>)bin.Deserialize(fs);
Light = (List<_light>)bin.Deserialize(fs);
StartupMap = (string)bin.Deserialize(fs);
startX = (int)bin.Deserialize(fs);
startY = (int)bin.Deserialize(fs);
Tiles=(列表)bin.反序列化(fs);
项目名称=(字符串)bin.Deserialize(fs);
根目录=(字符串)bin.反序列化(fs);
project_pat=(字符串)bin.Deserialize(fs);
项目类型=(字符串)bin.Deserialize(fs);
事件=(列表)bin.反序列化(fs);
Light=(List)bin.Deserialize(fs);
StartupMap=(字符串)bin.Deserialize(fs);
startX=(int)bin.反序列化(fs);
startY=(int)bin.Deserialize(fs);

使用正确的顺序

读取变量的顺序与写入变量的顺序不同。不要尝试/捕获每个元素,当一个元素无法(反)序列化时,它将失去同步。文件可以反序列化,也可以不首先尝试删除所有
catch{}
。很明显,您对它们进行了自盲。好的,我尝试删除所有try-catch。您读取变量的顺序与写入变量的顺序不同。不要尝试/捕获每个元素,当一个元素无法(反)序列化时,它将失去同步。文件可以反序列化,也可以不首先尝试删除所有
catch{}
。很明显,你对他们视而不见。好吧,我试着移除所有的试捕器,但现在我有了一个新问题。文件未保存。我已经将断点设置为SaveMireProject方法,新文件不会被保存。旧文件存在…请确保您没有将SaveMireProject置于try-catch方法中,可能是try-catch将捕获异常和多个问题。请查看屏幕和带有断点的红色矩形。但是现在我有一个新问题。文件未保存。我已经将断点设置为SaveMireProject方法,新文件不会被保存。旧文件存在…请确保您没有将SaveMireProject置于try-catch方法中,可能是try-catch将捕获异常和多个问题。请查看屏幕和带有断点的红色矩形。