在將對象或結構體序列化成二進制數據流時,咱們一般都會使用 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter 類來實現,c++
可是這種方式會把對象或結構體的類型信息給序列化到數據流中, 在作通迅時,這種方式是不可取的.c#
在c/c++中,一般對某個協議使用 struct 進行存儲,而後將其序列化, c#也能實現這樣的功能. 具體的實現辦法:spa
public static byte[] GetBytes<TStruct>(TStruct data) where TStruct : struct { int structSize = Marshal.SizeOf(typeof(TStruct)); byte[] buffer = new byte[structSize]; GCHandle handle = GCHandle.Alloc(buffer, GCHandleType.Pinned); Marshal.StructureToPtr(data, handle.AddrOfPinnedObject(), false); handle.Free(); return buffer; }
做爲參數的結構體,須要使用 [StructLayout]
和 [FieldOffset]分別聲明結構體和結構體中的成員.經過上面的方法,能夠將結構體中的成員序列化成
code
咱們須要的二進制數據流. 大部分的需求均可以實現, 但目前,我還不太清楚,若是須要實現相似於c/c++中, 使用聯合體做爲結構體成員,該若是實現.orm
若是有人知道,請留言告知,謝謝!對象