Сериализация и десериализация List<List <object >> с помощью BinaryFormatter

Допустим, у меня есть

List<object> mainList = new List<object>();

И это содержит

List<string> stringList = new List<string();
List<CustomClass> custList = new List<CustomClass>();
mainList.Add(stringList);
mainList.Add(custList);

Сериализовать

Stream stream;
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(stream, mainList);

Десериализовать

Stream stream = (Stream)o;
BinaryFormatter formatter = new BinaryFormatter();
List<object> retrievedList = (List<object>)formatter.Deserialize(stream);

В этот момент я получаю сообщение об ошибке, что чтение потока (десериализация) достигло конца потока без извлечения значения.

Нужно ли что-то указывать, кроме...

[Serializable]
public class CustomClass { .... }

в пользовательском классе, чтобы сделать эту работу? Могу ли я не десериализовать List>, который каждый раз содержит разные типы объектов?

Я старался

IList list = (IList)Activator.CreateInstance(typeof(custClassList[0]))

и попытался отправить и получить это, но получил ту же проблему.

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

2 ответа

Решение

По сути, BinaryFormatter - это шутка. В некоторых случаях это работает, но по неизвестным причинам не сработает в почти идентичных сценариях.

Лучшая и лучшая альтернатива BinaryFormatter - сторонняя библиотека protobuf-net ( https://github.com/mgravell/protobuf-net), разработанная Marc Gravell.

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

Я должен также упомянуть, что это быстрее, с точки зрения де / сериализации.

Чтобы устранить проблему, которая вызывает ошибку "поток прочитан (десериализация) достиг конца потока", положение потока необходимо сбросить до 0 следующим образом...

stream.Position = 0;

Нужно ли что-то указывать, кроме...

[Сериализуемый] открытый класс CustomClass { .... }

Нет... Это должно быть хорошо для того, что вы делаете.

в пользовательском классе, чтобы сделать эту работу? Могу ли я не десериализовать List>, который каждый раз содержит разные типы объектов?

Вы должны быть в состоянии сериализовать любой объект.

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