Десериализовать список BindingSource без двух копий в памяти? - PullRequest
1 голос
/ 14 июля 2011

«Документ» моего приложения на самом деле является просто BindingSource, у которого есть List <>.Поскольку вы не можете напрямую сериализовать BindingSource, когда приходит время сохранения, я сериализую List <>.

Когда приходит время загрузки, я бы хотел десериализовать прямо в BindingSource, но я не делаючто вы можете (член .List только для чтения).Поэтому мне нужно десериализовать во временный список и затем добавить каждый из элементов в список BindingSource.

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

Есть ли более прямой подход, который я должен использовать, или какой-то способ десериализации непосредственно в список, который содержит BindingSource?

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

Ответы [ 2 ]

0 голосов
/ 14 июля 2011

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

0 голосов
/ 14 июля 2011

Если размер достаточно велик, чтобы удерживать его дважды - это проблема, то, вероятно, удерживать его один раз - тоже проблема. Тем не мение; если вам интересно, protobuf-net имеет метод DeserializeItems, который возвращает небуферизованный (полностью потоковый) IEnumerable<T> - т.е. нет списка. Чтобы вы могли:

foreach(var item in {DeserializeItems})
    bindingSource.Add(item);

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

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

...