C#序列化結構體

在將對象或結構體序列化成二進制數據流時,咱們一般都會使用 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

若是有人知道,請留言告知,謝謝!對象

相關文章
相關標籤/搜索