C#序列化结构体
2014-02-23 23:02
281 查看
在将对象或结构体序列化成二进制数据流时,我们通常都会使用 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter 类来实现,
但是这种方式会把对象或结构体的类型信息给序列化到数据流中, 在做通迅时,这种方式是不可取的.
在c/c++中,通常对某个协议使用 struct 进行存储,然后将其序列化, c#也能实现这样的功能. 具体的实现办法:
作为参数的结构体,需要使用
我们需要的二进制数据流. 大部分的需求都可以实现, 但目前,我还不太清楚,如果需要实现类似于c/c++中, 使用联合体作为结构体成员,该如果实现.
如果有人知道,请留言告知,谢谢!
但是这种方式会把对象或结构体的类型信息给序列化到数据流中, 在做通迅时,这种方式是不可取的.
在c/c++中,通常对某个协议使用 struct 进行存储,然后将其序列化, c#也能实现这样的功能. 具体的实现办法:
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++中, 使用联合体作为结构体成员,该如果实现.
如果有人知道,请留言告知,谢谢!
相关文章推荐
- C#中Page事件执行顺序
- Visual C#自身没有类库
- C#事件与委托的区别
- C#事件与委托的区别
- C#中的继承(二)
- MD5加密(C#)
- C#连接Excel示例代码和驱动
- C#连接Excel示例代码和驱动
- C#一个方法返回多个值
- C#实现俄罗斯方块
- C#委托与事件的区别
- C#中的继承(一)
- C# 将字节流转换为图片的实例方法
- Selenium for C#的入门Demo
- c#中为什么有些类要声明为静态类?
- 【PYC#1 欢乐赛】 题解
- C#常用数据类型间的转换
- C#中有“静态类”的概念
- 处理VC开发的webservice在C#.NET中中文乱码问题
- C# webBrowser 开新窗口保持Session