Изучаю сериализацию/десериализацию данных. Написал следующий тестовый код:
using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
class Program
{
[Serializable]
public class Car
{
public string carName;
public int year;
public Engine engine;
[Serializable]
public class Engine
{
public string engineName;
public float power;
public Engine(string engineName, float power)
{
this.engineName = engineName;
this.power = power;
}
}
public Car(string carName, int year, string engineName, float power)
{
this.carName = carName;
this.year = year;
this.engine = new Engine(engineName, power);
}
}
public const string PATH = @"MyCar.dat";
public static void Main(string[] args)
{
Car myCar = new Car("Жигуль", 1980, "ВАЗ-2106", 300);
//SaveCar(myCar, PATH);
Car loadedCar = (Car)LoadCar(PATH);
Console.WriteLine(loadedCar.carName);
Console.WriteLine(loadedCar.engine.engineName);
}
public static void SaveCar(Car carToSave, string path)
{
BinaryFormatter bf = new BinaryFormatter();
FileStream file = File.Create(path);
bf.Serialize(file, carToSave);
file.Close();
Console.WriteLine($"Saved a car at {path}");
}
public static Car LoadCar(string path)
{
Car loadedCar = null;
if (File.Exists(path) == false)
{
Console.WriteLine("No file found.");
return null;
}
FileStream file = File.Open(path, FileMode.Open);
try
{
BinaryFormatter bf = new BinaryFormatter();
loadedCar = (Car)bf.Deserialize(file);
file.Close();
Console.WriteLine("Loaded a car") ;
return loadedCar;
}
catch(Exception e)
{
Console.Write(e.Message);
}
finally
{
file.Close();
}
return null;
}
}
В методе Main создаётся экземпляр класса Car и сохраняется в файл MyCar.dat. После этого файл загружается в новый экземпляр того же класса и с этого экземпляра считываются некоторые данные.
Код работает без проблем, файл сохраняется в директории с проектом.
Однако, когда я хочу загрузить уже имеющийся файл и комментирую первые две строки из метода Main, начинается следующая ругань:
System.InvalidCastException: Specified cast is not valid.
at Program.LoadCar (System.String path) [0x00027] in <0171c37513204a8a9a9a2473439f437c>:0
at Program.Main (System.String[] args) [0x0001a] in <0171c37513204a8a9a9a2473439f437c>:0
at (wrapper managed-to-native) System.Reflection.RuntimeMethodInfo.InternalInvoke(System.Reflection.RuntimeMethodInfo,object,object[],System.Exception&)
at System.Reflection.RuntimeMethodInfo.Invoke (System.Object obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) [0x0006a] in <c72658f647bc485bbfb8c9fcaa790862>:0
Исключение появляется в этой строчке:
loadedCar = (Car)bf.Deserialize(file);
Как же так выходит, что в первом случае распаковка проходит без проблем, а во втором вызывает исключение?