我正在为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);
}
}
这些是[Serializable]结构的列表,每个结构都有一些类型为int / float / long / string / char的变量。
但是当执行此代码时,我得到一个InvalistCastException: InvalidCastException warning
将鼠标悬停在Stream实例上会向我显示这也会导致读取/写入超时。
如果我继续运行程序,我会收到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);
}
}
我是编程的新手,也是c#的新手。我阅读了有关类似问题的其他问题,但无法使他们的任何解决方案起作用,或者我对它们的了解并不多。
由于我没有评级,我不能发布超过2个链接,但这里有关于这个问题的课程(据我所知)。
我的序列化程序类(从其他人复制):https:/./ pastebin.com/XHUqgq8y
我的保存二进制文件类:https:/./ pastebin.com/xqBw9YCY
我使用的结构:https:/./ pastebin.com/gDUuvAdh
我的加载类:https:/./ pastebin.com/NktKzFfD
程序类:https:/./ pastebin.com/eTxFmHbn
为链接我的一半代码而道歉,但我真的不知道可能导致错误的原因。
非常感谢任何帮助,但如果可能的话,请为像我这样的新手解释。谢谢!
答案 0 :(得分:0)
您有一些设计问题 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;
}