C# 尝试读取.bin文件时出现InvalidCastException/序列化异常

C# 尝试读取.bin文件时出现InvalidCastException/序列化异常,c#,exception,serialization,binary,C#,Exception,Serialization,Binary,我正在为CS:GO开发一个热图工具。它解密.dem(自定义演示)文件,然后将其序列化为二进制文件以供以后使用 序列化的数据如下所示: namespace HeatScatterToolv2 { class LoadAndVisualize { public void LoadFileFromBinary (string fileName) { MatchInfo matchInfo = BinarySerialization.ReadFromBinaryFile&

我正在为CS:GO开发一个热图工具。它解密.dem(自定义演示)文件,然后将其序列化为二进制文件以供以后使用

序列化的数据如下所示:

namespace HeatScatterToolv2
{
class LoadAndVisualize
{
    public void LoadFileFromBinary (string fileName)
    {
        MatchInfo matchInfo = BinarySerialization.ReadFromBinaryFile<MatchInfo>(fileName);
        List<PlayerInfo> listOfPlayers = BinarySerialization.ReadFromBinaryFile<List<PlayerInfo>>(fileName);
        List<RoundEndEvent> listOfRoundEndEvents = BinarySerialization.ReadFromBinaryFile<List<RoundEndEvent>>(fileName);
        List<BombPlantEvent> listOfBombPlants = BinarySerialization.ReadFromBinaryFile<List<BombPlantEvent>>(fileName);
        List<BombDefuseEvent> listOfBombDefuses = BinarySerialization.ReadFromBinaryFile<List<BombDefuseEvent>>(fileName);
        List<BombExplodeEvent> listOfBombExplosions = BinarySerialization.ReadFromBinaryFile<List<BombExplodeEvent>>(fileName);
        List<SmokeEvent> listOfSmokes = BinarySerialization.ReadFromBinaryFile<List<SmokeEvent>>(fileName);
        List<MolotovEvent> listOfMolotovs = BinarySerialization.ReadFromBinaryFile<List<MolotovEvent>>(fileName);
        List<FlashEvent> listOfFlashes = BinarySerialization.ReadFromBinaryFile<List<FlashEvent>>(fileName);
        List<GrenadeEvent> listOfGrenades = BinarySerialization.ReadFromBinaryFile<List<GrenadeEvent>>(fileName);
        List<KillEvent> listOfKills = BinarySerialization.ReadFromBinaryFile<List<KillEvent>>(fileName);
    }
}
名称空间HeatScatterToolv2
{
类LoadAndVisualize
{
public void LoadFileFromBinary(字符串文件名)
{
MatchInfo MatchInfo=BinarySerialization.ReadFromBinaryFile(文件名);
List listOfPlayers=BinarySerialization.ReadFromBinaryFile(文件名);
List listOfRoundEndEvents=BinarySerialization.ReadFromBinaryFile(文件名);
ListListofBombPlants=BinarySerialization.ReadFromBinaryFile(文件名);
List ListOfBombDefenses=BinarySerialization.ReadFromBinaryFile(文件名);
List ListofBombeExplosions=BinarySerialization.ReadFromBinaryFile(文件名);
List-ListofMokes=BinarySerialization.ReadFromBinaryFile(文件名);
List listOfMolotovs=BinarySerialization.ReadFromBinaryFile(文件名);
List listOfFlashes=BinarySerialization.ReadFromBinaryFile(文件名);
List ListOfGenades=BinarySerialization.ReadFromBinaryFile(文件名);
List listOfKills=BinarySerialization.ReadFromBinaryFile(文件名);
}
}
这些是[Serializable]结构的列表,每个结构都只有一些int/float/long/string/char类型的变量

然而,当执行此代码时,我得到一个InvalistCastException:

将鼠标悬停在流实例上会显示这也会给sme读/写超时

如果我继续运行该程序,则会出现SerializationException:

这是发生所有这些情况的代码:

public static T ReadFromBinaryFile<T>(string filePath)
    {
        using (Stream stream = File.Open(filePath, FileMode.Open))
        {
            bool canItTimeout = stream.CanTimeout;
            var binaryFormatter = new BinaryFormatter();
            return (T)binaryFormatter.Deserialize(stream);
        }
    }
publicstatict ReadFromBinaryFile(字符串文件路径)
{
使用(Stream=File.Open(filePath,FileMode.Open))
{
bool-cantitimeout=stream.CanTimeout;
var binaryFormatter=新的binaryFormatter();
返回(T)二进制格式化程序。反序列化(流);
}
}
我对编程和c#都是新手。我读过关于类似问题的其他问题,但他们的任何解决方案都不起作用,或者我不是很了解他们

由于我没有评级,我不能发布超过2个链接,但这里是与这个问题有关的类(据我所知)

我的序列化程序类(从另一个人复制):https:///pastebin.com/XHUqgq8y

我的保存二进制文件类:https:///pastebin.com/xqBw9YCY

我使用的结构:https:///pastebin.com/gDUuvAdh

我的加载类:https:///pastebin.com/NktKzFfD

程序类:https:///pastebin.com/eTxFmHbn

很抱歉链接了我一半的代码,但我真的不知道是什么导致了这个错误


非常感谢您的帮助,但如果可能的话,请向我这样的新手解释。谢谢!

您有一些设计问题 1) 首先,您不能继续再次打开同一个文件。因此,请将流传递给序列化方法 2) 对于二进制数据,您不知道列表中项目的编号。因此必须将计数传递给序列化方法。我假设matchInfo将包含其他列表对象的计数

       public void LoadFileFromBinary(string fileName)
        {
            using (Stream stream = File.Open(filePath, FileMode.Open))
            {

                MatchInfo matchInfo = BinarySerialization.ReadFromBinaryFile<MatchInfo>(stream);
                int count = 1;
                List<PlayerInfo> listOfPlayers = BinarySerialization.ReadFromBinaryFile<List<PlayerInfo>>(stream,count);
                List<RoundEndEvent> listOfRoundEndEvents = BinarySerialization.ReadFromBinaryFile<List<RoundEndEvent>>(stream, count);
                List<BombPlantEvent> listOfBombPlants = BinarySerialization.ReadFromBinaryFile<List<BombPlantEvent>>(stream, count);
                List<BombDefuseEvent> listOfBombDefuses = BinarySerialization.ReadFromBinaryFile<List<BombDefuseEvent>>(stream, count);
                List<BombExplodeEvent> listOfBombExplosions = BinarySerialization.ReadFromBinaryFile<List<BombExplodeEvent>>(stream, count);
                List<SmokeEvent> listOfSmokes = BinarySerialization.ReadFromBinaryFile<List<SmokeEvent>>(stream, count);
                List<MolotovEvent> listOfMolotovs = BinarySerialization.ReadFromBinaryFile<List<MolotovEvent>>(stream, count);
                List<FlashEvent> listOfFlashes = BinarySerialization.ReadFromBinaryFile<List<FlashEvent>>(stream, count);
                List<GrenadeEvent> listOfGrenades = BinarySerialization.ReadFromBinaryFile<List<GrenadeEvent>>(stream, count);
                List<KillEvent> listOfKills = BinarySerialization.ReadFromBinaryFile<List<KillEvent>>(stream, count);
            }
        }

        public static List<T> ReadFromBinaryFile<T>(Stream stream, int count)
        {
            List<T> data = new List<T>();
            var binaryFormatter = new BinaryFormatter();

            for (int i = 0; i < count; i++)
            {
                data.Add((T)binaryFormatter.Deserialize(stream));
            }

            return data;
        }
public void LoadFileFromBinary(字符串文件名)
{
使用(Stream=File.Open(filePath,FileMode.Open))
{
MatchInfo MatchInfo=BinarySerialization.ReadFromBinaryFile(流);
整数计数=1;
List listOfPlayers=BinarySerialization.ReadFromBinaryFile(流,计数);
List listOfRoundEndEvents=BinarySerialization.ReadFromBinaryFile(流,计数);
ListListofBombPlants=BinarySerialization.ReadFromBinaryFile(流,计数);
List ListOfBombDefenses=BinarySerialization.ReadFromBinaryFile(流,计数);
List ListofBombeExplosions=BinarySerialization.ReadFromBinaryFile(流,计数);
List-ListofMokes=BinarySerialization.ReadFromBinaryFile(流,计数);
List listOfMolotovs=BinarySerialization.ReadFromBinaryFile(流,计数);
List listOfFlashes=BinarySerialization.ReadFromBinaryFile(流,计数);
List ListOfGenades=BinarySerialization.ReadFromBinaryFile(流,计数);
List listOfKills=BinarySerialization.ReadFromBinaryFile(流,计数);
}
}
公共静态列表ReadFromBinaryFile(流、整型计数)
{
列表数据=新列表();
var binaryFormatter=新的binaryFormatter();
for(int i=0;i
非常好的解释!感谢您的帮助!