Сериализация объекта затем десериализация как список<объект> C#

Я застрял в этой проблеме, и я где-то искал ответы, но не нашел то, что соответствует моей проблеме. Я хочу сериализовать объект и сохранить его в двоичный файл, и deserialize это как список, так как он будет возвращать несколько строк записей.

Итак, это мой класс

[Serializable]
public class DTOMultiConfig
{
    public string Key { get; set; }
    public string KeyValue { get; set; }
}

[Serializable]
public class DTOMultiConfigs : List<DTOMultiConfig>
{
    public void Dispose()
    {
    }
}

и я использую эти методы, которые я нашел в Интернете. Вот как я сериализую свой объект, эта часть работает

public void Editor_Config(DTOMultiConfig dto)
{
    if (dto.ID == 0)//new
    {
        dto.ID = 0;
        WriteToBinaryFile(BinPath, dto, true);
    }
    else//edit
    {
    }
}

public static void WriteToBinaryFile<T>(string filePath, T objectToWrite, bool append = false)
{
    using (Stream stream = System.IO.File.Open(filePath, append ? FileMode.Append : FileMode.Create))
    {
        var binaryFormatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
        binaryFormatter.Serialize(stream, objectToWrite);
    }
}

Вот как я использую deserialize метод, я не уверен, я уверен, что я делаю это неправильно, потому что это не работает вообще. ReadFromBinaryFile перестает работать прямо перед оператором return

public PartialViewResult ShowListOfConfigs()
{
    List<DTOMultiConfig> dto = new List<DTOMultiConfig>();

    //DESERIALIZE  

    dto = ReadFromBinaryFile<List<DTOMultiConfig>>(BinPath);
    return PartialView("_ListOfConfigs", dto);
}

public static T ReadFromBinaryFile<T>(string filePath)
{
    using (Stream stream = System.IO.File.Open(filePath, FileMode.Open))
    {
        var binaryFormatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
        return (T)binaryFormatter.Deserialize(stream);
    }
}

Любые ответы с некоторыми объяснениями будут оценены.

1 ответ

Решение

Позвольте мне попытаться объяснить. Представьте, что вы используете не двоичный сериализатор, а XML-сериализатор. В этом случае то, что вы будете писать, будет выглядеть примерно так:

<DTOMultiConfig>
  <Key>SomeKey</Key>
  <Value>SomeValue</Value>
</DTOMultiConfig>

Теперь, когда вы читаете свои данные обратно, вы пытаетесь десериализовать свой единственный экземпляр в список, который, однако, должен выглядеть примерно так:

<ListOfDTOMultiConfigs>
  <DTOMultiConfig>
    <Key>SomeKey</Key>
    <Value>SomeValue</Value>
  </DTOMultiConfig>
  [...potentially more elements here...]
</ListOfDTOMultiConfigs>

Это просто не может работать. В двоичном мире фактические данные в файле будут выглядеть иначе. Однако та же проблема сохраняется: вы не можете написать один тип и прочитать другой обратно, если их структура не является абсолютно идентичной.

Чтобы разобраться с вашим конкретным случаем, вы можете прочитать один элемент и затем поместить его в список, если вам нужен список. Или вы можете написать список с одним элементом в ваш файл, а затем прочитать этот список обратно, используя приведенный выше код.

РЕДАКТИРОВАТЬ:

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

<DTOMultiConfig>
  <Key>SomeKey</Key>
  <Value>SomeValue</Value>
</DTOMultiConfig>
<DTOMultiConfig>
  <Key>SomeKey</Key>
  <Value>SomeValue</Value>
</DTOMultiConfig>

Если вы сравните это с моим примером представления списка выше, вы увидите, что они не идентичны и, следовательно, не могут использоваться взаимозаменяемо.

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