C#中实现byte[]与任意对象互换(服务端通讯专用)
来源:互联网 发布:域名注册不用实名 编辑:程序博客网 时间:2024/06/05 19:27
C++中,我们可以非常方便的将网络通讯接收来的char*缓冲区转成任意类型的结构体,并从中提取必要信息,只需要一个结构体类型指针的强制转换即可。
但是在C#中,所有涉及到内存及指针的操作均被判定为不安全操作,使得上述机制的实现变得复杂化。
要在C#中便捷的实现网络通讯缓冲区byte[]与任意类型对象的相互转换,常用的方法大致有三:
1.序列化与反序列化
注意:传入的结构体类型一定是“可序列化的(Serializable)”
优点:安全可靠
使用这种方法一般不会产生其他的副作用,其安全度在C#的可控范围之内。
缺点:浪费资源、效率偏低
使用这种方法会造成不必要的资源浪费:
800 1024
1000 2048
3000 4096
6000 8192
10000 16384
使用这种方法一般不会产生其他的副作用,其安全度在C#的可控范围之内。
缺点:资源浪费,不易实现
使用这种方法造成了额外的内存申请与复制。
另外,针对每种特定类型的数据包,需要提供特定的包解析与生成机制。
可以考虑通过包类型间的继承关系降低后期维护的难度。比如:定义一种基类型的数据包,子类数据包继承基类数据包的成员,并重写基类的解析与生成方法等等。
3.Marshal
该类对外提供了一个方法集,这些方法用于分配非托管内存、复制非托管内存块、将托管类型转换为非托管类型,此外还提供了在与非托管代码交互时使用的其他杂项方法。
.net 4.0 实现方法:
优点:高效、易实现
这个方法的实际效果与C++类似,不存在额外的内存申请及拷贝动作。
缺点:不安全、功能受限
1> 某些特殊情况下,该方法会失效。
2> 由于涉及到了与非托管内存间的转换,安全度降低。
3> C#中的Struct功能弱化,无法有效组织数据包继承关系。
4> 在一些特有环境下,Marshal的权限并未全部公开,比如Silverlight。
- C#中实现byte[]与任意对象互换(服务端通讯专用)
- C#中实现byte[]与任意对象互换(服务端通讯专用)
- C# float与Byte[]互换
- c#中int32与byte[]之间的互换,以及base64编码的转换
- c#中int32与byte[]之间的互换,以及base64编码的转换
- Untiy中用C#实现TCP通讯(Socket通讯)服务端与客户端皆可
- android利用apkplug框架实现主应用与插件通讯(传递任意对象)实现UI替换
- socket实现服务端与客户端的通讯
- c++实现websocket服务端与JavaScript通讯
- JAVA 与 C# 通讯中的 int 与 byte 互转
- C# BitmapImage对象和byte[]之间的互转、BitmapImage和Bitmap互换
- C#中文件和byte[]互换问题
- Java中利用socket实现简单的服务端与客户端的通信(中级)——实现任意双向通信
- C++ socket编程 实现服务端与客户端的通讯
- socket实现客户端与服务端的通讯(群聊)
- socket编程 实现服务端与客户端的通讯
- C++ socket编程 实现服务端与客户端的通讯
- C++ socket编程 实现服务端与客户端的通讯
- POJ1125——Stockbroker Grapevine
- 一些国外优秀的elasticsearch使用案例
- 二分法查找
- (八)Z-Stack 添加自己任务
- 第十一周项目4-特殊三位数
- C#中实现byte[]与任意对象互换(服务端通讯专用)
- makefile 总结
- 用VS2010创建三层架构开发模式及三层架构的研究
- C++创建对象的两种方法(C++用new和不用new创建类对象)
- spring mvc注解方式实现向导式跳转页面
- 《NoSQL精粹》读后感(一)
- [Unity3D]蓝港面试题
- 单点登录cas与权限管理框架shiro集成------普通web项目方式
- android原生browser分析(二)--界面篇