3 回答
TA贡献1794条经验 获得超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条经验 获得超13个赞
就像其他人之前说过的那样,您可以使用二进制序列化,但是它可能会产生一个额外的字节,或者被反序列化为具有不完全相同数据的对象。另一方面,使用反射非常复杂且非常缓慢。还有另一种解决方案可以将您的对象严格转换为字节,反之亦然-编组:
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);
并将字节转换为对象:
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);
与您自己的序列化字段(逐字段复制)相比,将这种方法用于小型对象和结构要慢得多,并且在某种程度上不安全(由于从/到非托管内存的双重复制),但这是将对象严格转换为byte []而不实现序列化的最简单方法并且没有[Serializable]属性。
- 3 回答
- 0 关注
- 710 浏览
添加回答
举报