【问题标题】:Deserialize a BindingSource list without having two copies in memory?在内存中没有两个副本的情况下反序列化 BindingSource 列表?
【发布时间】:2011-07-14 18:54:28
【问题描述】:

我的应用程序的“文档”实际上只是一个具有 List 的 BindingSource。由于不能直接序列化 BindingSource,所以当需要保存时,我将 List 序列化。

当需要加载时,我想直接反序列化到 BindingSource,但我做不到(.List 成员是只读的)。所以我必须反序列化为一个临时列表,然后将每个项目添加到 BindingSource 的列表中。

这意味着当我完成时,内存中有两个副本,其中一个将被清理,但如果文件变大,这将是一个问题。

我应该采取更直接的方法,还是直接反序列化到 BindingSource 持有的列表中?

我尝试单独序列化列表中的元素,而不是序列化列表,但生成的磁盘文件要大得多。

【问题讨论】:

    标签: c# generics serialization bindingsource


    【解决方案1】:

    如果尺寸足够大以至于持有两次是个问题,那么持有一次可能也是个问题。然而;如果您有兴趣,protobuf-net 有一个 DeserializeItems 方法,该方法返回一个非缓冲(完全流式传输)IEnumerable<T> - 即没有列表。所以你可以:

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

    我也几乎可以保证它在磁盘上会更小,处理起来也更快。

    不过,我想知道“虚拟模式”是否是大型列表的更好选择。

    【讨论】:

      【解决方案2】:

      当数据到达时,您可以使用Queue/Dequeue 将列表从一个列表传输到另一个列表

      【讨论】:

        猜你喜欢
        • 2017-02-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多