Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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#_Exception_Serialization_Casting - Fatal编程技术网

C#序列化-无效的强制转换异常

C#序列化-无效的强制转换异常,c#,exception,serialization,casting,C#,Exception,Serialization,Casting,我的Windows窗体程序有一些问题。为了保存一些变量,我使用这个序列化方法。它工作得很好,但现在不知何故它不再。。。 当我运行下面的代码时,我总是得到一个无效的强制转换异常。(我将在底部发布错误消息) 问题是,实际上不应该有任何无效的演员阵容。我检查了错误消息中调用的,但是那里的转换是正确的 using (FileStream fs = File.Open(@"data", FileMode.Open, FileAccess.Read)) {

我的Windows窗体程序有一些问题。为了保存一些变量,我使用这个序列化方法。它工作得很好,但现在不知何故它不再。。。 当我运行下面的代码时,我总是得到一个无效的强制转换异常。(我将在底部发布错误消息)

问题是,实际上不应该有任何无效的演员阵容。我检查了错误消息中调用的,但是那里的转换是正确的

using (FileStream fs = File.Open(@"data", FileMode.Open, FileAccess.Read))
                    {
                        BinaryFormatter bf = new BinaryFormatter(); ;
                        Form1.Money = (ulong)(bf.Deserialize(fs));
                        Form1.LifetimeMoney = (ulong)(bf.Deserialize(fs));
                        // Lade Achievement Variablen aus Form1
                        Form1.lifetime1 = (int)(bf.Deserialize(fs));
                        Form1.lifetime_booked = (int)(bf.Deserialize(fs));
                        Form1.lifetime1_cchanged = (bool)(bf.Deserialize(fs));
                        Form1.lifetime2 = (int)(bf.Deserialize(fs));
                        Form1.lifetime2_booked = (int)(bf.Deserialize(fs));
                        Form1.lifetime2_cchanged = (bool)(bf.Deserialize(fs));
                        Form1.lifetime3 = (int)(bf.Deserialize(fs));
                        Form1.lifetime3_booked = (int)(bf.Deserialize(fs));
                        Form1.lifetime3_cchanged = (bool)(bf.Deserialize(fs));
                        Form1.farms50 = (int)(bf.Deserialize(fs));
                        Form1.farms50_booked = (int)(bf.Deserialize(fs));
                        Form1.farms50_cchanged = (bool)(bf.Deserialize(fs));
                        Form1.farms500 = (int)(bf.Deserialize(fs));
                        Form1.farms500_booked = (int)(bf.Deserialize(fs));
                        Form1.farms500_cchanged = (bool)(bf.Deserialize(fs));
                        Form1.shops50 = (int)(bf.Deserialize(fs));
                        Form1.shops50_booked = (int)(bf.Deserialize(fs));
                        Form1.shops50_cchanged = (bool)(bf.Deserialize(fs));
                        Form1.shops500 = (int)(bf.Deserialize(fs));
                        Form1.shops500_booked = (int)(bf.Deserialize(fs));
                        Form1.shops500_cchanged = (bool)(bf.Deserialize(fs));
                        Form1.factory50 = (int)(bf.Deserialize(fs));
                        Form1.factory50_booked = (int)(bf.Deserialize(fs));
                        Form1.factory50_cchanged = (bool)(bf.Deserialize(fs));
                        Form1.factory500 = (int)(bf.Deserialize(fs));
                        Form1.factory500_booked = (int)(bf.Deserialize(fs));
                        Form1.factory500_cchanged = (bool)(bf.Deserialize(fs));
                        Form1.zinsAmount = (int)(bf.Deserialize(fs));
                        // Lade various
                        Form1.timePlayed = (long)(bf.Deserialize(fs));
                        Form1.loadedGame = (int)(bf.Deserialize(fs));
                        // Lade Businesstrip Daten
                        Form1.businessTimer1 = (int)(bf.Deserialize(fs));
                        Form1.business1Random = (int)(bf.Deserialize(fs));
                        Form1.business1Income = (int)(bf.Deserialize(fs));
                        Form1.triptime1 = (double)(bf.Deserialize(fs));
                        Form1.businessLifetimeEarning = (ulong)(bf.Deserialize(fs));
                        // Lade Casino Daten aus Form1
                        Form1.inv1chance = (int)(bf.Deserialize(fs));
                        Form1.inv2chance = (int)(bf.Deserialize(fs));
                        Form1.investment1 = (int)(bf.Deserialize(fs));
                        Form1.investment2 = (char)(bf.Deserialize(fs));
                        Form1.moneyWonCasino = (ulong)(bf.Deserialize(fs));
                        fs.Close();
                    } // using end
                }
错误消息:

************** Exception Text **************
System.InvalidCastException: Specified cast is not valid.
   at IdleGameTest.LoadSave.LoadGame() in c:\Users\Sior\Documents\Visual Studio 2013\Projects\IdleGameTest\IdleGameTest\LoadSave.cs:line 176
   at IdleGameTest.Form1.b_loadGame_Click(Object sender, EventArgs e) in c:\Users\Sior\Documents\Visual Studio 2013\Projects\IdleGameTest\IdleGameTest\Form1.cs:line 341
   at System.Windows.Forms.Control.OnClick(EventArgs e)
   at System.Windows.Forms.Button.OnClick(EventArgs e)
   at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
   at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.ButtonBase.WndProc(Message& m)
   at System.Windows.Forms.Button.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)


************** Loaded Assemblies **************
mscorlib
    Assembly Version: 4.0.0.0
    Win32 Version: 4.0.30319.18444 built by: FX451RTMGDR
    CodeBase: file:///C:/Windows/Microsoft.NET/Framework/v4.0.30319/mscorlib.dll
----------------------------------------
IdleGameTest
    Assembly Version: 1.0.0.0
    Win32 Version: 1.0.0.0
    CodeBase: file:///C:/Users/Sior/Documents/Visual%20Studio%202013/Projects/IdleGameTest/IdleGameTest/bin/Debug/IdleGameTest.exe
----------------------------------------
System.Windows.Forms
    Assembly Version: 4.0.0.0
    Win32 Version: 4.0.30319.18408 built by: FX451RTMGREL
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms/v4.0_4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll
----------------------------------------
System.Drawing
    Assembly Version: 4.0.0.0
    Win32 Version: 4.0.30319.18408 built by: FX451RTMGREL
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Drawing/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll
----------------------------------------
System
    Assembly Version: 4.0.0.0
    Win32 Version: 4.0.30319.18408 built by: FX451RTMGREL
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System/v4.0_4.0.0.0__b77a5c561934e089/System.dll
----------------------------------------
System.Configuration
    Assembly Version: 4.0.0.0
    Win32 Version: 4.0.30319.18408 built by: FX451RTMGREL
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Configuration/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll
----------------------------------------
System.Xml
    Assembly Version: 4.0.0.0
    Win32 Version: 4.0.30319.18408 built by: FX451RTMGREL
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll
----------------------------------------
以下是: System.InvalidCastException:指定的强制转换无效。 在c:\Users\Sior\Documents\visualstudio 2013\Projects\IdleGameTest\IdleGameTest\LoadSave.cs中的IdleGameTest.LoadGame()处:第176行

对Form1.investment1=(int)(bf.反序列化(fs))的引用;哪个是正确的演员阵容,因为 Form1.investment1是一个整数。所以我不明白


我真的需要一些帮助,有什么明显的我看不到的吗?

听起来您的文件格式不正确,或者您丢失了一个属性。你说

对Form1.investment1=(int)(bf.反序列化(fs))的引用;这是一个正确的强制转换,因为Form1.investment1是一个整数

但是
Form1.investment1
是不相关的。在大多数情况下,无效强制转换在实际发生强制转换的等号右侧表示错误
bf。反序列化(fs)
返回的内容不是
int
,因此无法转换为
int
。这并不是说它不能将属性设置为该属性,因为这将是一个编译器错误

检查
bf.Deserialize(fs)
此时返回的内容,我打赌您会发现您的问题


您确定要反序列化的属性在顺序和数量上与您首先序列化以生成文件的属性匹配吗?

嘿,谢谢您的回复。。。我查了一下你们的数量和订单评论,现在看来效果不错。我是这个序列化方法的新手,我不知道注释行会导致这样的问题(看起来是注释行),我保证不是注释行导致的。但也就是说,很有可能当您第二次保存文件进行测试时,它重写了一些刚才才出现的错误,而您早已忘记了这些错误。不管怎样,我很高兴它现在起作用了。我也很高兴。再次感谢!:)