另一种测量物体尺寸的方法

时间:2012-10-19 16:50:20

标签: c# memory serialization

搜索Google和StackOverFlow会提出很多关于这个问题的参考资料。包括例如:

Ways to determine size of complex object in .NET?

How to get object size in memory?

因此,我在开始时说,我明白通常无法获得准确的测量结果。然而,我并不关心这一点 - 我正在寻找能够给出相对价值而不是绝对价值的东西。所以,如果他们偏离某种方式或其他方式并不重要。

我有一个复杂的对象图。它由单亲(T)和可能有孩子的孩子组成,等等。图中的所有对象都来自同一个基类。 Childrean采用List T的形式。

我尝试了序列化方法和不安全方法来计算大小。他们给出了不同的答案,但两个案例中的“相对”问题是相同的。

我假设父对象的大小将大于子对象大小的总和。事实证明这不是真的。我计算了父母的大小。然后总结了孩子们的大小。在某些情况下,这似乎有意义,但在其他情况下,孩子的总和远远超过为父母确定的大小。

所以我的问题是:为什么我的简单假设是序列化一个对象可能导致的大小小于子项的总和。我得出的唯一答案是每个序列化对象都有固定的开销(我猜这是不言而喻的),并且这些的总和可能超过父级的“自己的大小”。如果是这样,有没有办法确定可能会产生什么开销,以便我可以考虑它呢?

非常感谢任何建议。

修改 抱歉,我忘了说所有对象都标记为可序列化,序列化方法是:

var bf = new BinaryFormatter();
            var ms = new MemoryStream();
            bf.Serialize(ms, testObject);
            byte[] array = ms.ToArray();
            return array.Length;

1 个答案:

答案 0 :(得分:1)

这实际上取决于您用于序列化对象的序列化机制。它可能没有序列化子元素,这就是为什么你看到父元素大小小于子元素总和(可能甚至小于每个孩子)的原因之一。

如果您想知道对象的相对大小,请确保序列化图表中所有对象的所有字段

编辑:因此,如果您使用的是二进制格式化程序,那么您必须查看该序列化程序使用的格式规范以了解开销。格式规范是公开的,可以在http://msdn.microsoft.com/en-us/library/cc236844(prot.20).aspx找到。消化并不是很容易,但是如果你愿意花时间去理解它,你会发现每个对象在序列化形式中确实有多少开销。