在将对象或结构体序列化成二进制数据流时,我们通常都会使用 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter 类来实现,
但是这种方式会把对象或结构体的类型信息给序列化到数据流中, 在做通迅时,这种方式是不可取的.
在c/c++中,通常对某个协议使用 struct 进行存储,然后将其序列化, c#也能实现这样的功能. 具体的实现办法:
1
2
3
4
5
6
7
8
9 |
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]分别声明结构体和结构体中的成员.通过上面的方法,可以将结构体中的成员序列化成
我们需要的二进制数据流. 大部分的需求都可以实现, 但目前,我还不太清楚,如果需要实现类似于c/c++中, 使用联合体作为结构体成员,该如果实现.
如果有人知道,请留言告知,谢谢!
原文:http://www.cnblogs.com/prolove2/p/3563822.html