Korzystanie .NET 4.0 Potrafię szybko przekonwertować strukturę do tablicy bajtów i z nich, korzystając z klasy Marshal. Na przykład, następujący prosty przykład będzie działał na około 1 milion razy na sekundę na moim komputerze, który jest wystarczająco szybki dla moich celów ...WinRT i trwająca struktura do iz tablicy bajtów?
[StructLayout(LayoutKind.Sequential)]
public struct ExampleStruct
{
int i1;
int i2;
}
public byte[] StructToBytes()
{
ExampleStruct inst = new ExampleStruct();
int len = Marshal.SizeOf(inst);
byte[] arr = new byte[len];
IntPtr ptr = Marshal.AllocHGlobal(len);
Marshal.StructureToPtr(inst, ptr, true);
Marshal.Copy(ptr, arr, 0, len);
Marshal.FreeHGlobal(ptr);
return arr;
}
Ale klasa Marszałek nie jest dostępny pod WinRT, który jest na tyle rozsądny ze względów bezpieczeństwa, ale oznacza to, że potrzebuję innego sposobu na uzyskanie mojej tablicy struct/byte from array.
Szukam podejścia, które działa dla każdej stałej wielkości struct. Mógłbym rozwiązać problem, pisząc niestandardowy kod dla każdej struktury, która wie, jak przekonwertować tę konkretną strukturę i utworzyć tablicę bajtów, ale jest to raczej uciążliwe i nie mogę oprzeć się wrażeniu, że istnieje pewne ogólne rozwiązanie.
Czy serializacja binarna jest niedostępna? Kolejne pytanie brzmi: jeśli wydajność jest ważna, dziwnym wydaje się być użycie "AllocHGlobal". – user7116
Dobra uwaga dotycząca używania AllocHGlobal dla każdego połączenia. Moje faktyczne wdrożenie jest nieco bardziej skomplikowane, aby być bardziej wydajnym. Przechowuje pliki len, arr i ptr, tak aby każde faktyczne wywołanie konwersji na bajty dotyczyło tylko Marshal.StructureToPtr i Marshal.Copy. Zamieszczony kod był tylko uproszczonym przykładem. –
Problem z serializacją binarną jest związany z obciążeniem. Struktura z pojedynczym polem int32 zostanie zserializowana do około 140 bajtów. Jeśli twoje struktury są dość duże, to obciążenie to nie jest wielka sprawa, ale w moim scenariuszu mam wiele obiektów, które są względnie małe. Zatem przekonwertowanie struktury do rzeczywistych 4 bajtów, które zawiera, to duża oszczędność w moim przypadku. –