.NET 4.0'ı kullanma Marşın sınıfını kullanarak bir yapıya bayt dizisine hızlı bir şekilde dönüştürebiliyorum. Örneğin, aşağıdaki basit örnek ... benim amaçlar için yeterince hızlıdır benim makinede saniyede 1 milyon civarında zamanlardaWinRT ve bir dizi bayttan gelen ve devam eden yapı?
[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;
}
çalışacaktır Ama Mareşal sınıfı yeterince makul WinRT altında kullanılamaz güvenlik nedenleriyle, ancak bu, bayt dizisine/yapısından yapılamamın başka bir yoluna ihtiyacım var demektir.
Herhangi bir sabit boyutlu yapı için çalışan bir yaklaşım arıyorum. Bu yapıyı bir bayt dizisine dönüştürmeyi ve bir bayt dizisi oluşturmayı bilen her bir yapı için özel kod yazarak çözebilirim ancak bu oldukça sıkıcıdır ve yardımcı olamıyorum, ancak bazı genel çözümlerin olduğunu hissediyorum.
İkili serileştirme resim dışı mı? Başka bir soru, performansın önemli olup olmaması AllocHGlobal'ın dahil edilmesi tuhaf görünüyor. – user7116
Her arama için AllocHGlobal kullanımı hakkında iyi bir nokta. Benim gerçek uygulamam daha verimli olmak için biraz daha karmaşıktır. Len, arr ve ptr'yi önbelleğe alır, böylece her gerçek çağrının bytes'e dönüştürülmesi yalnızca Marshal.StructureToPtr ve Marshal.Copy'yi içerir. Gönderilen kod sadece basitleştirilmiş bir örnektir. –
İkili serileştirme ile yaşadığım sorun ek yük. Tek bir int32 alanına sahip bir yapı 140 baytlık bir şeye serileştirilir. Eğer yapılarınız oldukça büyükse, o zaman bu ek yük çok büyük değildir, fakat senaryonda göreceli olarak küçük nesnelerim var. Bu yüzden, yapıyı içerdiği gerçek 4 bayta dönüştürmek benim durumumda büyük bir tasarruf. –