2012-01-16 33 views
3

我试图通过计算一个对象的大小(以串行方式许多之一)执行一个反常的内存技巧,所以我可以跳转到内存流到下一个。如何获得C#中的对象(类,结构)的大小

这是一个托管类。我已经看到了sizeof和Mashal.SizeOf的引用,但是它们出现在引用非托管类型或值类型中。

那么,有没有人知道在运行时做到这一点的方法,或者我应该打破计算器,它在代码中手动执行它?

+2

什么“记忆流“,你在说什么?如果你正在谈论一个对象的* serialized *大小,这可能与内存大小非常不同。 – 2012-01-16 07:23:15

+0

文件流,本质上。我正在编写一些代码来手动解析xml文件,它包含在一个zip文件中。由于我想加快速度,只需要解析偶尔的项目,我希望能够预先计算对象的大小,以便我可以跳过。例如,如果我有这些对象中的20个,但我只需要第一个和第十二个,我想通过计算跳转来说一些时间,而不是逐行解析,直到达到我的目标。 – user978122 2012-01-16 07:45:59

+0

这取决于托管对象如何序列化到MemoryStream中。你能告诉我们你的序列化代码吗? – Heinzi 2012-01-16 07:54:09

回答

5

,如果你不使用不安全的编码(元帅)
您可以像使用一个工具,你不能获得对象的大小:

CLR探查
VSTS探查
.NET内存分析器

+1

因此,手动计算将是要走的路,陷入困境。 – user978122 2012-01-16 08:06:11

+0

这是一个答案,因为海报谈到了XML数据流,而不是内存中的东西? – TomTom 2012-05-20 19:45:26

+0

请允许我解释一下:mekici的答案是,在C#中尝试获取数据结构的大小是不值得的,因为CLR正在使估计的大小变得有趣。鉴于此,我选择使用计算的数据结构大小,至少在短期内。我试图做一些使用数据流的东西,这对于所有的密集目的都可以像内存中的数组那样处理。 – user978122 2012-05-21 06:18:36