2016-03-01 84 views
4

我是C#中的新成員。
我想了解爲什麼結構大小增長。
即:測試結構的
結構C的大小#

struct Test 
{ 
    float x; 
    int y; 
    char z; 
} 

大小實際上是10個字節(浮= 4,INT = 4,炭= 2)。
但是當我試圖用Marshal.SizeOf(..)方法我得到了12
在C得到的sizeof結構++我沒有pragma pack(1),以防止這一點,但我怎樣才能做到這一點在C#中?

另一個問題是:
當我試圖測試結構轉換爲字節數組,如果該結構是不[Serialize]我得到作爲例外字節數組大小12字節(或不),但如果結構是[Serialize]我得到字節數組大小爲170字節,爲什麼它的發生?
謝謝! :)

+0

*當我試圖測試結構轉換爲字節數組*您是如何試圖做到這一點? – xanatos

+0

如果結構不是[序列化]我轉換是用這種方法http://stackoverflow.com/questions/3278827/how-to-convert-a-structure-to-a-byte-array-in-c(檢查答案),如果soi轉​​換它與http://stackoverflow.com/questions/628843/byte-for-byte-serialization-of-a-struct-in-c-sharp(最後一個答案) – Evyatar

+0

請記住如果你使用Marshaller或序列化 - 你不測量結構的大小。您正在測量非託管等效項或序列化表單的大小。這兩者都不一定與結構本身的大小有關。 –

回答

9

[StructLayout(LayoutKind.Sequential, Pack = 1)] 
struct TestStruct 
{ 
    float x; 
    int y; 
    char z; 
} 

會給Marshal.SizeOf() == 9,因爲Marshal.SizeOf(typeof(char)) == 1對於陌生的歷史原因。

[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Unicode)] 

這樣,你會得到Marshal.SizeOf() == 10

+0

謝謝,以及與[Serialize] – Evyatar

+0

@Evyatar的大小有關你應該使用http://stackoverflow.com/questions/3278827/how-to-convert-a如果它是可序列化的,並且它不是可執行的,那麼它就是結構體到字節數組。 – xanatos

+0

@Evyatar如果您對'[Serializable]'使用@C​​mdrTallen解決方案,則您正在執行XML序列化,因此您將序列化爲一個XML字符串。 – xanatos