4

I'm new in C#.
I'm trying to understand why the struct size is grow.
I.e:

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

size of Test struct is actually 10 bytes (float=4, int=4, char=2).
But when i tried to get the sizeof struct with Marshal.SizeOf(..) method i got 12.
In C++ i did pragma pack(1) to prevent this but how can i do it in C#?

Another question:
When i tried to convert the Test struct to byte array if the struct isn't [Serialize] i got byte array with size 12 bytes as excepted (or not), but if the struct is [Serialize] i got byte array with size of 170 bytes, why its happend?
Thanks! :)

5
  • When i tried to convert the Test struct to byte array How are you trying to do it? Commented Mar 1, 2016 at 7:29
  • if the struct isn't [Serialize] i convert is with this method stackoverflow.com/questions/3278827/… (the checked answer) and if soi convert it with stackoverflow.com/questions/628843/… (the last answer) Commented Mar 1, 2016 at 7:36
  • Bear in mind that if you're using the Marshaller or serialization - you're not measuring the size of the struct. You're measuring the size of the unmanaged equivalent, or of the serialized form. Neither is necessarily related to the size of the struct itself. Commented Mar 1, 2016 at 7:39
  • @Damien_The_Unbeliever, i dont use Marshal to know the sizeof serazlied struct. Commented Mar 1, 2016 at 7:54
  • What I mean is the Marshal.SizeOf: "The size returned is the size of the unmanaged type. The unmanaged and managed sizes of an object can differ" Commented Mar 1, 2016 at 7:56

1 Answer 1

10

This

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

will give a Marshal.SizeOf() == 9, because Marshal.SizeOf(typeof(char)) == 1 for strange historical reasons.

BUT

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

with this you'll get Marshal.SizeOf() == 10

Sign up to request clarification or add additional context in comments.

3 Comments

Thanks, and what about the size of with [Serialize]
@Evyatar You should use the stackoverflow.com/questions/3278827/… way both if it is serializable and if it isn't.
@Evyatar And if you are using @CmdrTallen solution for [Serializable], you are doing XML serialization, so you are serializing to an XML string.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.