socket传输结构体:网络传输——结构体还是序列化?



虽然,网络编程里面数据传送推荐用序列化,但我不用,还是选择结构体(返璞归真),有以下几点理由:
1.跨平台问题:
  序列化确实可以很好跨语言平台,可大多数网络游戏不需要跨语言平台

2.别以为有了序列化就不需要结构体
  表面上序列化代码量小按顺序读和写char   LPCSTR ... 就好逻辑对象写不写都无所谓那就是大错而特错了
  待序列化对象发送前结构还是不可省略序列化过程就是 object->(按定顺序拆分)write->s->(按拆分顺序组装)read->object过程
 其实object还是不能省略,很多人写网络不注重逻辑对象结构,收到s按定顺序读和写就完事了,这样虽然灵活,但缺乏结构,容易造成混乱调试起来是灾难
   所以结构体(或类)还是省略不了所以:别以为有了序列化就不需要结构体了

3.结构体存在内存对齐和CPU不兼容问题可以避免
  确结构体是有内存对齐问题,存在兼容性问题,我可以选择pack(1)把内存对齐给关闭掉,避免兼容性问题,既然选择了iocp就不打算跨平台了,可以避免结构体平台兼容问题

4.结构体调试起来方便很多减少内存拷贝效率高
  不用序列化可write和read过程就不需要过多考虑(少写太多代码了)read write 就好像现代社会每个人每天都要穿衣服和脱衣服原始社会需要吗?其实人类进化到原始裸奔状态才是最爽快:)
  但还是要说句公道话:有人说序列化编码解码read write 需要耗费资源, 诚然这个过程基本等于赋值和内存拷贝那点效率损失主要还在内存拷贝上这点效率损失很小不能作为序列化缺点当然如果涉及到数据加密那将是另外个话题

5.结构体貌似呆板发送数据限制多发送变长数据就不方便数据组织起来也不灵活
  我想这是很多人抛弃结构体选择用序列化方式发送和接受数据个很重要原因
  但:其实对于变长结构(子结构也是变长)问题,用结构体来实现确很麻烦,但并不代表不能实现
  我已经实现了,而且读和写变长子结构体嵌套任意多层都不成问题,可以存储复杂变长数据结构
  数据就如同能自动序列化样方便这个应该是技术难点但细心去做是可以实现

6.有关结构体指针
  游戏里面要发送数据内存事先分配好不存在指针,深度复制更不用考虑所以内存拷贝不会出错
  如果用到指针即使用序列化来实现也会面临同样问题也占不了多少便宜由于C这们语言特点
  不象java那样有个标准实现,对于序列化本身没有个统标准所以可想而知有人说:boost有它序列化实现
  其实那个实现不见得就合适你自己如果真要做序列化编码和解码仿照那个过程自己写才最为牢靠
  哪些指针对应内存需要序列化那些不需要序列化是个逻辑结构需要自己说了算才好(好像扯远了点)
  说回游戏数据既然不用需要他用到指针结构体用来发送数据也没问题

7 平台扩充问题
  退万步说:换了语言就基本上换了客户端客户端数据组织形式都要重写[Page]
  实在不行还可以考虑用xml json 编码等等些跨平台解决方案现在所写结构体是可以用来做数据接收只是发送不再是结构体而已

8.综上所述
  如果需要跨语言平台不用序列化( 2进制流或xml, json文本等等)根本无法实现
  序列化优点还是非常多.如果主要是跨平台和语言自定义读写规则,根据需要读写对象部分数据,
  空间浪费少,不存在内存对齐问题等诸多优点缺点就是拐弯抹角代码量大调试不方便


权衡了良久
  数据如果能组织合理而且没有跨语言平台要求用结构体也未尝不可,毕竟数据发送直来直去还是方便些减少内存拷贝效率也高了很多
  特别是调试起来容易太多了衡量利弊我还是放弃了序列化选择了原始结构体只是难在数据组织(好在基本已经克服了)

我知道:序列化很好很强大很多网络高手根本不屑于用结构体用这个就好象是旁门左道狗肉上不了大雅的堂狗肉还是很多人喜欢吃:)

我还是返璞归真选择了结构体

句话:物尽其用恰当够用就好

Tags:  结构体初始化 结构体数组 结构体 socket传输结构体

延伸阅读

最新评论

发表评论