Сериализация объекта затем десериализация как список<объект> 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>
Если вы сравните это с моим примером представления списка выше, вы увидите, что они не идентичны и, следовательно, не могут использоваться взаимозаменяемо.