Правильный способ сериализации и десериализации данных?

У меня есть массив данных класса, который я сериализую в массив байтов, а затем помещаю его в базу данных. Эта программа работает по расписанию в ночное время. С другой стороны, у меня есть другая программа, которая извлекает эти данные из базы данных, обрабатывает их в отчет — по крайней мере, таков план. Класс заключен в 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, почему я не могу просто вставить его в любой класс, который я считаю нужным, разве это не цель приведения, чтобы сообщить компилятору, как я хочу, чтобы данные были упорядочены и структурированы?

Потому что вы используете сериализатор, который гарантирует, что данные помещаются в тот же тип, что и раньше. Вы можете использовать другие методы сериализации, создавать общую сборку данных или использовать любой другой механизм для обмена данными.

Sami Kuhmonen 08.04.2019 08:16
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
46
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Двоичный сериализованный поток данных содержит заголовок с информацией о типе. Вы можете обратиться к структуре данных двоичного формата здесь. Вот почему вы получаете это исключение об отсутствующей сборке.

Один из способов решить вашу проблему — реализовать SerializationBinder, который переопределяет тип для десериализации во время выполнения и устанавливает свойство Binder для BinaryFormatter. Здесь — очень хороший пример.

Предпочтительным решением было бы использование альтернативных форматов сериализации, таких как XML, JSON.

Спасибо за вклад, Стотакура. В итоге я пошел по маршруту Биндера, это полезная информация. Я мог бы работать с xml или json для будущих экземпляров. Спасибо.

megabytes 09.04.2019 01:47

Другие вопросы по теме