У меня есть массив данных класса, который я сериализую в массив байтов, а затем помещаю его в базу данных. Эта программа работает по расписанию в ночное время. С другой стороны, у меня есть другая программа, которая извлекает эти данные из базы данных, обрабатывает их в отчет — по крайней мере, таков план. Класс заключен в 2 пространства имен, первое — имя приложения, второе — просто что-то для хранения моих структур. Например ниже.
namespace FibreTrend
{
namespace Structures
{
[Serializable]
public class Trend
{
public Trend(DateTime date, string ref, int port)
{
Date = date;
Reference = ref;
PortNo = port;
}
public DateTime Date;
public string Reference;
public int PortNo;
}
}
}
{
// Function to take the trendData list, convert it to a byte array
// List<Structures.Trend> trendData;
BinaryFormatter bf = new BinaryFormatter();
using (MemoryStream mStream = new MemoryStream())
{
bf.Serialize(mStream, trendData.ToArray());
byte[] b = mStream.ToArray();
// code that pushes the array into the database...
}
}
У меня есть совершенно отдельное приложение, которое считывает данные из базы данных в виде массива байтов. Затем я перехожу к преобразованию его из байтов обратно в мой класс данных.
using (MemoryStream mStream = new MemoryStream())
{
BinaryFormatter binaryFormat = new BinaryFormatter();
mStream.Write(data, 0, data.Length);
mStream.Seek(0, SeekOrigin.Begin);
Structures.Trend[] obj = (Structures.Trend[])binaryFormat.Deserialize(mStream);
}
И вот моя ошибка. Он говорит мне, что хочет, чтобы двоичный файл FibreTrend десериализовал данные. Почему?? Мой класс Trend имеет тот же размер, такое же расположение данных, это точная копия и вставка из моего другого проекта. Почему он настаивает на том, чтобы мой другой двоичный файл был в компаньоне. Когда я добавляю к нему двоичный файл, а затем десериализую его в объект, он помещается как FibreTrend.Structures.Trend[]. Я, очевидно, не собираюсь включать в него другой двоичный файл, я также не собираюсь дважды обрабатывать данные, преобразовывая их в Report.Structures.Trend[]. Это просто поток 1 и 0, почему я не могу просто вставить его в любой класс, который я считаю нужным, разве это не цель приведения, чтобы сообщить компилятору, как я хочу, чтобы данные были упорядочены и структурированы?
Двоичный сериализованный поток данных содержит заголовок с информацией о типе. Вы можете обратиться к структуре данных двоичного формата здесь. Вот почему вы получаете это исключение об отсутствующей сборке.
Один из способов решить вашу проблему — реализовать SerializationBinder
, который переопределяет тип для десериализации во время выполнения и устанавливает свойство Binder
для BinaryFormatter
. Здесь — очень хороший пример.
Предпочтительным решением было бы использование альтернативных форматов сериализации, таких как XML, JSON.
Спасибо за вклад, Стотакура. В итоге я пошел по маршруту Биндера, это полезная информация. Я мог бы работать с xml или json для будущих экземпляров. Спасибо.
Потому что вы используете сериализатор, который гарантирует, что данные помещаются в тот же тип, что и раньше. Вы можете использовать другие методы сериализации, создавать общую сборку данных или использовать любой другой механизм для обмена данными.