第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

將任何對象轉(zhuǎn)換為字節(jié)[]

將任何對象轉(zhuǎn)換為字節(jié)[]

胡說叔叔 2019-10-06 14:57:34
我正在編寫一個原型TCP連接,但在均勻化要發(fā)送的數(shù)據(jù)時遇到了一些麻煩。目前,我只發(fā)送字符串,但是將來我們希望能夠發(fā)送任何對象。此刻的代碼非常簡單,因為我認為所有內(nèi)容都可以轉(zhuǎn)換為字節(jié)數(shù)組:void SendData(object headerObject, object bodyObject){  byte[] header = (byte[])headerObject;  //strings at runtime,   byte[] body = (byte[])bodyObject;      //invalid cast exception  // Unable to cast object of type 'System.String' to type 'System.Byte[]'.  ...}這當然很容易解決if( state.headerObject is System.String ){...}問題是,如果我這樣做,我需要在運行時檢查無法轉(zhuǎn)換為byte []的每種類型的對象。由于我不知道每個對象在運行時都不能轉(zhuǎn)換為byte [],因此這實際上不是一個選擇。如何在C#.NET 4.0中將任何對象完全轉(zhuǎn)換為字節(jié)數(shù)組?
查看完整描述

3 回答

?
慕田峪9158850

TA貢獻1794條經(jīng)驗 獲得超7個贊

使用BinaryFormatter:


byte[] ObjectToByteArray(object obj)

{

    if(obj == null)

        return null;

    BinaryFormatter bf = new BinaryFormatter();

    using (MemoryStream ms = new MemoryStream())

    {

        bf.Serialize(ms, obj);

        return ms.ToArray();

    }

}

請注意,obj其中的任何屬性/字段obj(及其所有屬性/字段都將如此)都需要標記為該Serializable屬性,以便以此成功進行序列化。


查看完整回答
反對 回復(fù) 2019-10-06
?
開心每一天1111

TA貢獻1836條經(jīng)驗 獲得超13個贊

就像其他人之前說過的那樣,您可以使用二進制序列化,但是它可能會產(chǎn)生一個額外的字節(jié),或者被反序列化為具有不完全相同數(shù)據(jù)的對象。另一方面,使用反射非常復(fù)雜且非常緩慢。還有另一種解決方案可以將您的對象嚴格轉(zhuǎn)換為字節(jié),反之亦然-編組:


var size = Marshal.SizeOf(your_object);

// Both managed and unmanaged buffers required.

var bytes = new byte[size];

var ptr = Marshal.AllocHGlobal(size);

// Copy object byte-to-byte to unmanaged memory.

Marshal.StructureToPtr(your_object, ptr, false);

// Copy data from unmanaged memory to managed buffer.

Marshal.Copy(ptr, bytes, 0, size);

// Release unmanaged memory.

Marshal.FreeHGlobal(ptr);

并將字節(jié)轉(zhuǎn)換為對象:


var bytes = new byte[size];

var ptr = Marshal.AllocHGlobal(size);

Marshal.Copy(bytes, 0, ptr, size);

var your_object = (YourType)Marshal.PtrToStructure(ptr, typeof(YourType));

Marshal.FreeHGlobal(ptr);

與您自己的序列化字段(逐字段復(fù)制)相比,將這種方法用于小型對象和結(jié)構(gòu)要慢得多,并且在某種程度上不安全(由于從/到非托管內(nèi)存的雙重復(fù)制),但這是將對象嚴格轉(zhuǎn)換為byte []而不實現(xiàn)序列化的最簡單方法并且沒有[Serializable]屬性。


查看完整回答
反對 回復(fù) 2019-10-06
  • 3 回答
  • 0 關(guān)注
  • 741 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號