3 回答

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屬性,以便以此成功進行序列化。

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]屬性。
- 3 回答
- 0 關(guān)注
- 741 瀏覽
添加回答
舉報