关于 c#:测量对象大小的另一种方法

 2022-01-08 

Yet Another Take on Measuring Object Size

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

在 .NET 中确定复杂对象大小的方法?

如何获取内存中的对象大小?

所以让我在开始时说,我理解通常不可能获得准确的测量结果。但是我并不担心——我正在寻找能给我相对价值而不是绝对价值的东西。因此,如果他们以一种或另一种方式偏离了一点也没关系。

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

我已经尝试了序列化方法和不安全方法来计算大小。他们给出了不同的答案,但在这两种情况下,"相对"问题是相同的。

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

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

非常感谢您的任何建议。

编辑
对不起,我忘了说所有对象都标记为可序列化序列化方法是:

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

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

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

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