【问题标题】:System.InvalidCastException: 'Specified cast is not valid.'System.InvalidCastException:“指定的演员表无效。”
【发布时间】: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#


【解决方案1】:

您应该使用 BinaryFormatter.Serialize 方法来序列化您的对象。在您的代码中,您编写了一个缓冲区,但这可能不会做同样的事情

可以用这种方式编写数据序列化示例

GameSaved reloaded = new GameSaved();
void Main()
{
    GameSaved game = new GameSaved();
    game.Num_Of_Saved_Game = 2;
    game.Name_Of_Saved_Game = new string[] {"game1", "game2"};

    Serialize(@"e:\temp\serialize.bin", game);
    Deserialize(@"e:\temp\serialize.bin");

    Console.WriteLine("Games:" + reloaded.Num_Of_Saved_Game);
    foreach(string s in reloaded.Name_Of_Saved_Game)
        Console.WriteLine(s);
}

void Deserialize(string filename1)
{
    BinaryFormatter formatter = new BinaryFormatter();
    using(FileStream fs = new FileStream(filename1, FileMode.Open, FileAccess.Read))
        reloaded = (GameSaved)formatter.Deserialize(fs);
}
void Serialize(string filename1, GameSaved game)
{
    BinaryFormatter formatter = new BinaryFormatter();
    using (FileStream fs = new FileStream(filename1, FileMode.OpenOrCreate, FileAccess.Write))
        formatter.Serialize(fs, game);

}
[Serializable]
struct GameSaved
{
    public int Num_Of_Saved_Game;
    public string[] Name_Of_Saved_Game;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-27
    • 2023-04-10
    • 2018-02-06
    • 1970-01-01
    相关资源
    最近更新 更多