2012-01-16 34 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