C# - Cast a byte array to an array of struct and vice-versa (reverse)

arrays, byte, c#, casting, struct

Solution

Regarding Array Type Conversion

C# as a language intentionally makes the process of flattening objects or arrays into byte arrays difficult because this approach goes against the principals of .NET strong typing. The conventional alternatives include several serialization tools which are generally seen a safer and more robust, or manual serialization coding such as `BinaryWriter`.

Having two variables of different types point to the same object in memory can only be performed if the types of the variables can be cast, implicitly or explicitly. Casting from an array of one element type to another is no trivial task: it would have to convert the internal members that keep track of things such as array length, etc.

A simple way to write and read Color[] to file

void WriteColorsToFile(string path, Color[] colors)
{
    BinaryWriter writer = new BinaryWriter(File.OpenWrite(path));

    writer.Write(colors.Length);

    foreach(Color color in colors)
    {
        writer.Write(color.ToArgb());
    }

    writer.Close();
}

Color[] ReadColorsFromFile(string path)
{
    BinaryReader reader = new BinaryReader(File.OpenRead(path));

    int length = reader.ReadInt32();

    Colors[] result = new Colors[length];

    for(int n=0; n<length; n++)
    {
        result[n] = Color.FromArgb(reader.ReadInt32());
    }

    reader.Close();
}

Problem

I would like to save a Color[] to a file. To do so, I found that saving a byte array to a file using "System.IO.File.WriteAllBytes" should be very efficient. I would like to cast my Color[] (array of struct) to a byte array into a safe way considering: - Potential problem of little endian / big endian (I think it is impossible to happen but want to be sure) - Having 2 differents pointer to the same memory which point to different type. Does the garbage collection will know what to do - moving objects - deleting a pointer ??? If it is possible, it would be nice to have a generic way to cast array of byte to array of any struct (T struct) and vice-versa. If not possible, why ? Thanks, Eric I think that those 2 solutions make a copy that I would like to avoid and also they both uses Marshal.PtrToStructure which is specific to structure and not to array of structure: - Reading a C/C++ data structure in C# from a byte array - How to convert a structure to a byte array in C#?

Original source

Related problems