【发布时间】:2018-04-01 07:55:31
【问题描述】:
我正在尝试使用 memorystream 和 filestream 以及一个结构来读取二进制文件,代码如下:
BinaryFormatter formatter = new BinaryFormatter();
MemoryStream mStream = new MemoryStream();
byte[] buffer = null;
long numBytes = new FileInfo(filename1).Length;
FileStream fs = new FileStream(filename1, FileMode.Open, FileAccess.Read);
BinaryReader br = new BinaryReader(fs);
buffer = br.ReadBytes((int)numBytes);
mStream.Write(buffer, 0, buffer.Length);
mStream.Position = 0;
GameSaved newdata = (GameSaved)formatter.Deserialize(mStream);
mStream.Close();
fs.Close();
fs.Dispose();
mStream.Dispose();
GameSaved 结构如下所示:
[Serializable]
struct GameSaved
{
public int Num_Of_Saved_Game;
public string[] Name_Of_Saved_Game;
}
但是代码抛出了错误
System.InvalidCastException: '指定的强制转换无效。'
编辑:这就是我保存 GameSaved 结构的方式:
buffer = null;
formatter = new BinaryFormatter();
mStream = new MemoryStream();
formatter.Serialize(mStream, newdata);
buffer = mStream.ToArray();
mStream.Close();
filename = "name.sav";
curFile = @"c:\C#\Try_To_Save_MS\Try_To_Save_MS\bin\Debug\name.sav";
if (File.Exists(curFile))
File.Delete(curFile);
fs = new FileStream(filename, FileMode.Create, FileAccess.Write);
fs.Write(buffer, 0, (int)buffer.Length);
fs.Dispose();
mStream.Dispose();
谁能告诉我解决问题的方法?
最好的问候
【问题讨论】:
-
哪一行抛出异常?
GameSaved newdata = (GameSaved)? -
这是行“GameSaved newdata = (GameSaved)formatter.Deserialize(mStream);”
-
序列化 GameSaved 实例的部分可能有问题。你能把那个代码也加进去吗?
-
请开始使用 using()。所有这些 .Close()/.Dispose() 都让我非常担心你的应用程序的其余部分。
-
当您使用 BinaryFormatter 时,这是一个非常标准的错误。它非常聪明,并且确切地知道使用了哪个 GameSaved 声明。不仅仅是它的命名空间名称和类型名称以及它有哪些成员,还有它来自什么程序集。回读时不使用 exact 相同程序集时的 Kaboom。因此,您可能犯的一个基本错误是重新声明结构。实际上,您必须将它放在一个类库中,您可以在编写文件的代码和读取文件的代码中使用该类库。
标签: c#