Сериализация и десериализация 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>, который каждый раз содержит разные типы объектов?
Вы должны быть в состоянии сериализовать любой объект.