@FogyX

Почему не распаковывается переменная типа object во время десериализации бинарного файла в C#?

Изучаю сериализацию/десериализацию данных. Написал следующий тестовый код:

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);

Как же так выходит, что в первом случае распаковка проходит без проблем, а во втором вызывает исключение?
  • Вопрос задан
  • 91 просмотр
Пригласить эксперта
Ответы на вопрос 1
tentrun
@tentrun
Clown c# inside
Даже собрал твой код.
Проблем не увидел.
6265af7de527d971367617.png
Возможно директория требует для записи прав администратора, ибо судя по всему ты что-то не то засунул в bf.Deserialize вот оно и ругается когда пытаешься привести к Car

Так же не совсем понимаю зачем ты все делаешь static.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы