2016-03-01 71 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