[VB 2008] Wertetyp ohne Umweg in Byte-Array kopieren

19/08/2010 - 14:54 von Armin Zingler | Report spam
Hi,

wie bekomme ich ein Objekt auf dem Stack (also ein Wertetyp)
am schnellsten in ein per GCHandle gepinntes Byte-Array? Und
zwar mit _einem_ Kopiervorgang. Das Objekt müsste ja nicht
gepinnt werden.

Armin
 

Lesen sie die antworten

#1 Thomas Scheidegger
19/08/2010 - 15:16 | Warnen spam
Hallo Armin

wie bekomme ich ein Objekt auf dem Stack (also ein Wertetyp)
am schnellsten in ein per GCHandle gepinntes Byte-Array?



ein managed Objekt (auch Werte-Typen) hat
ein eigenes (internes) Memory-Layout,
das nicht unbedingt immer 1:1 dem erwarteten, klassischen
von C/C++ entspricht, also dann auch nicht direkt einem 'Byte-Array'.

Von dem her kommt hier wohl immer eine Art 'Marshalling' zum Zuge,
welches etwa mittels Interop-Attributen beginnend mit
http://msdn.microsoft.com/en-us/lib...ibute.aspx
http://msdn.microsoft.com/en-us/lib...ibute.aspx
definiert/beeinflusst werden kann.

Zum Umwandeln hilft dann etwa:
Function RawSerializeEx(ByVal anyFmt As Object) As Byte()
Dim rawSize As Integer = Marshal.SizeOf(anyFmt)
Dim rawDatas(rawSize - 1) As Byte
Dim handle As GCHandle = GCHandle.Alloc(rawDatas,
GCHandleType.Pinned)
Dim buffer As IntPtr = handle.AddrOfPinnedObject()
Marshal.StructureToPtr(anyFmt, buffer, False)
handle.Free()
RawSerializeEx = rawDatas
End Function

P.S.
Eine managed 'Alternative' wàre Binary Serializer:
http://msdn.microsoft.com/en-us/lib...atter.aspx
wo aber die 'metadata' mit ins (somit deutlich grössere) Byte-Array
hineinkommen.



Thomas Scheidegger - 'NETMaster'
http://dnetmaster.net/

Ähnliche fragen