【发布时间】:2010-09-13 14:23:49
【问题描述】:
如何确保我添加到 SerializationInfo 对象中的对象得到处置?
例如:如果我向 info 对象添加一个哈希表,我如何确保在序列化之后,没有对我的类的 hastable 对象的活动引用并且我可以以某种方式释放内存?
info.AddValue("attributesHash", attributesHash, typeof(System.Collections.Hashtable));
更新(代码)
[Serializable]
class A : System.Runtime.Serialization.ISerializable
{
List<int> m_Data = new List<int>();
//...
public void GetObjectData(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context)
{
if (m_Data != null)
{
info.AddValue("MyData", m_Data, typeof(List<int>));
m_Data.Clear();
}
m_Data = null; // <-- Will this be collected by GC?
GC.GetTotalMemory(true); //forced collection
}
};
我的问题是:如果我在添加到信息列表后使我的对象为空,它会在调用序列化后被释放(当信息被破坏时 - 我希望),或者在调用 GC 的函数时(我希望不这么认为)?
如果设置'm_Data = null'不会把它标记为垃圾,那我怎么知道m_Data占用的内存已经被释放了呢?
【问题讨论】:
-
这个问题没有意义,垃圾收集器管理内存,而不是你。序列化程序完成后不会保留引用。
-
我只是想知道它是否存在......如果是,那么直到什么时候。谢谢
-
您显示的代码严重错误。调用 AddValue() 将复制您的 m_data 引用,但序列化机制在 GetObjectData 返回之后才真正使用此引用 - 但您在下一行清除此集合 - 所以您总是序列化一个空集合。
-
嗯.. 这是否意味着该引用的副本没有临时保存到集合中?我想,我正在将引用传递到集合中。因此,应该有两个对象指向相同的数据,其中之一是 m_Data。如果我将 m_Data 设置为 null,那么另一个仍在引用该内存位置,对吗?
标签: c# memory serialization memory-management