【问题标题】:MemoryStream and deep cloningMemoryStream 和深度克隆
【发布时间】:2011-08-19 08:23:20
【问题描述】:

我在我的一种方法中使用 MemoryStream 作为深度克隆。我多次调用该方法,我注意到我调用它的次数越多,它就越减慢我的程序。当我停止使用内存流时,有没有办法每次清除内存流?

    public static T DeepClone<T>(T obj)
    {
        using (var ms = new MemoryStream())
        {
            var formatter = new BinaryFormatter();
            formatter.Serialize(ms, obj);
            ms.Position = 0;

            return (T)formatter.Deserialize(ms);
        }
    }

【问题讨论】:

  • 请注意,序列化任何东西都是非常昂贵的操作。
  • 我认为每次离开作用域时使用都会释放 MemoryStream...
  • @zenwalker 我反驳说;即使是缓慢的 BinaryFormatter 也可以。可以使用更快的序列化程序。
  • 到目前为止,我已经阅读了每一个序列化成本高昂的地方。但是,如果 OP 对此感到满意,那么我不明白他为什么在这里抱怨进展缓慢。
  • 德米特里:这里的数据是什么?它可以可能通过 protobuf-net 完成,该网络针对这种类型的使用进行了极大的优化(现在已经有 2 天了,但是如果你想要一个示例并且可以等待......)

标签: c# clone memorystream


【解决方案1】:

内存流在每次调用的 using 语句末尾被释放。然而,它可能直到稍后才会被垃圾收集。我不认为潜在的内存使用是你的问题。如果您在调用之间有明显的速度差异,我认为您每次都必须序列化一个更复杂的对象。如果您添加诊断语句,例如

Console.WriteLine("Serialized size "+ms.Position);

在您致电Serialize() 后,它会每次都报告相同的数字,还是会增加大小?如果大小增加,那么您每次都在序列化一个更大的对象图,并且预计会变慢。

【讨论】:

  • 每次都是0..但是..它被连续调用8-10次..当我点击一个按钮时,消息连续弹出8次(调用函数)
  • 位置每次都是零?您确定在调用序列化之后和将位置设置为零之前添加了 console.writeline 吗?如果您看到的调用比您预期的要多,我认为您可能不止一次地将处理程序添加到您的控件中! IE。检查你在哪里做 += 并处理按钮点击。不要多次添加处理程序!
  • 是1607..每次.被调用大约20次
  • 我认为您的问题不在于序列化,而在于处理程序被多次调用。在添加点击处理程序的行上设置断点,即在 button1.Clicked += new EventHandler(MyHandlerMethod);您应该只在该断点处中断一次。否则,请修复该问题,以便您只添加一次处理程序。
  • 那些是循环,在我的代码中......我想我找到了问题......这不是深度克隆
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-01
  • 2010-09-09
  • 1970-01-01
  • 2017-09-17
相关资源
最近更新 更多