免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 17059 | 回复: 17

[算法] 网络传输过程结构体序列化的问题 [复制链接]

论坛徽章:
0
发表于 2007-11-20 09:28 |显示全部楼层
网络传输过程结构体序列化的问题

在网络传输过程中,需要将函数的参数序列化,
也就是将函数的参数一次copy到一个固定的内存块中发送出去
例如:
int rtStart(int handle, int path, char sth)

对于此函数无非是:
memcpy(buffer, &handle, sizeof(int));
memcpy(buffer + sizeof(int), &path, sizeof(int));
memcpy(buffer + 2*sizeof(int), &sth, sizeof(char));


目前遇到的问题是:
函数类型如下:
int rtStart(int handle, int path, A* sth)
typedef struct
{
     int a;
     int b;
      B* c;
}A;

然后
typedef struct
{
     int a;
     int b;
      C* c;
}B;

...
...
这样的嵌套有好多层,
而且类似的函数有一百多个,如果单纯的依靠手工
一个一个内存拷贝的话显然太stupid了,
有没有一种可以通用的序列化功能,
类似于
int rtStart(int handle, int path, A* sth)
{
    ser(1);//1是函数类型号,预定义

     ...
}

ser函数和调用者函数无关,然后就将rtStart参数序列化?
不考虑用xml传输,因为网络传输太频繁,xml效率无法满足要求
或者ACE里面有没有类似的功能?

论坛徽章:
24
狮子座
日期:2013-12-31 10:48:0015-16赛季CBA联赛之吉林
日期:2016-04-18 14:43:1015-16赛季CBA联赛之北控
日期:2016-05-18 15:01:4415-16赛季CBA联赛之上海
日期:2016-06-22 18:00:1315-16赛季CBA联赛之八一
日期:2016-06-25 11:02:2215-16赛季CBA联赛之佛山
日期:2016-08-17 22:48:2615-16赛季CBA联赛之福建
日期:2016-12-27 22:39:272016科比退役纪念章
日期:2017-02-08 23:49:4315-16赛季CBA联赛之八一
日期:2017-02-16 01:05:3415-16赛季CBA联赛之山东
日期:2017-02-22 15:34:5615-16赛季CBA联赛之上海
日期:2017-11-25 16:17:5015-16赛季CBA联赛之四川
日期:2016-01-17 18:38:37
发表于 2007-11-20 10:24 |显示全部楼层

回复 #1 okmmno1 的帖子

原帖由 okmmno1 于 2007-11-20 09:28 发表
网络传输过程结构体序列化的问题

在网络传输过程中,需要将函数的参数序列化,
也就是将函数的参数一次copy到一个固定的内存块中发送出去
例如:
int rtStart(int handle, int path, char sth);
对于此函 ...


看来像是做“远程调用”,跟我现在做的差不多。   在远程调用程序中,我是尽量避免使用含有指针的结构体,如果要用只能自己编程做打包处理。 目前 C/C++ 不支持自动序列化,我想这是因为编译后的执行文件没有保留完整的类型信息,不过以后的 C++ 可能会加上完整的 RTTI 和自动序列化。

论坛徽章:
0
发表于 2007-11-20 10:32 |显示全部楼层
原帖由 zhujiang73 于 2007-11-20 10:24 发表


看来像是做“远程调用”,跟我现在做的差不多。   在远程调用程序中,我是尽量避免使用含有指针的结构体,如果要用只能自己编程做打包处理。 目前 C/C++ 不支持自动序列化,我想这是因为编译后的执行文件 ...

恩,差不多就是远程调用的概念,但是目前想做的就是,实现一个自动化的概念,有程序自己控制序列化的功能,而不是手工的每次去copy

论坛徽章:
24
狮子座
日期:2013-12-31 10:48:0015-16赛季CBA联赛之吉林
日期:2016-04-18 14:43:1015-16赛季CBA联赛之北控
日期:2016-05-18 15:01:4415-16赛季CBA联赛之上海
日期:2016-06-22 18:00:1315-16赛季CBA联赛之八一
日期:2016-06-25 11:02:2215-16赛季CBA联赛之佛山
日期:2016-08-17 22:48:2615-16赛季CBA联赛之福建
日期:2016-12-27 22:39:272016科比退役纪念章
日期:2017-02-08 23:49:4315-16赛季CBA联赛之八一
日期:2017-02-16 01:05:3415-16赛季CBA联赛之山东
日期:2017-02-22 15:34:5615-16赛季CBA联赛之上海
日期:2017-11-25 16:17:5015-16赛季CBA联赛之四川
日期:2016-01-17 18:38:37
发表于 2007-11-20 11:07 |显示全部楼层

回复 #3 okmmno1 的帖子

原帖由 okmmno1 于 2007-11-20 10:32 发表

恩,差不多就是远程调用的概念,但是目前想做的就是,实现一个自动化的概念,有程序自己控制序列化的功能,而不是手工的每次去copy


需要把函数参数打包,再发送到远端是吗?  对于简单类型,和不含有指针的结构体数据,通用指针可以帮你大大简化这一过程,不过遇到含有指针的结构体,必须自己先打包才能处理。可以参考一下我的大作:    http://blog.chinaunix.net/u/21585/showart_290864.html

今天 “C++ 简单远程调用” 第三版完成了,现在我叫他 “gcpprc” ,这次主要改进了远程调用过程中参数的打包和解包过程。这次我把 gcpprc 和演示程序的源码分成两组源文件,这样 gcpprc 就可以单独编译成一个共享库。我决定 gcpprc 在 lgpl2 协议下发行,对 lgpl 通常的理解是,如果您写的软件始终以动态连接的形式连接到这个函数库,您可以不公开源码,静态连接和对库本身的修改需要公开源码。这样您就可以用 gcpprc 开发商业程序了,我个人认为 gcpprc 可以把一部分网络程序的编程难度降低一半以上,如果您需要对 gcpprc 的技术支持和定制开发,我就要考虑收费了。  这次发布的 gcpprc 的演示程序 gcpprccli/gcpprcser 在 gpl2 协议下发行,关于对 gpl/lgpl 的权威解释请看 http://www.gnu.org/licenses/ 。 附件中是 gcpprc 程序源码,真正的本人原创。

论坛徽章:
0
发表于 2007-11-20 12:19 |显示全部楼层
你还是在每个结构体定义的时候同时定义该结构的序列化函数吧.统一接口.
在纯C中,比如,在结构中加个函数指针,C++中使用一个统一的基类或虚函数,在每个需要远程传输类中都实现该功能.

论坛徽章:
0
发表于 2007-11-26 10:49 |显示全部楼层
有没有一种类似corba的实现方式呢?

论坛徽章:
0
发表于 2007-11-26 14:44 |显示全部楼层
原帖由 okmmno1 于 2007-11-20 09:28 发表
网络传输过程结构体序列化的问题

在网络传输过程中,需要将函数的参数序列化,
也就是将函数的参数一次copy到一个固定的内存块中发送出去
例如:
int rtStart(int handle, int path, char sth);
对于此函 ...


这种做法是有问题的。

论坛徽章:
0
发表于 2007-11-26 15:04 |显示全部楼层
楼上兄弟,能具体指教一下么?
现在的想法是,在客户端可服务器两个各准备一个文件,里面对各个结构体进行描述,然后再程序运行时,
程序按照文件中的内容对传进的结构体进行内存序列化。

论坛徽章:
0
发表于 2007-11-26 15:16 |显示全部楼层
原帖由 okmmno1 于 2007-11-26 15:04 发表
楼上兄弟,能具体指教一下么?
现在的想法是,在客户端可服务器两个各准备一个文件,里面对各个结构体进行描述,然后再程序运行时,
程序按照文件中的内容对传进的结构体进行内存序列化。

你的方法是可行的,可以处理那些内容比较简单,特别是字段之间没有依赖的情况。
我见过的别的做法都比较相似,每个结构体都写一个serialize函数,有嵌套指针的时候就直接调那个结构体的serialize函数。跟重载<<,>>思想一样。当然这是C++的做法。如果C的话也差不多,因类所用到的结构体类型在编码时期就是确定的。

论坛徽章:
24
狮子座
日期:2013-12-31 10:48:0015-16赛季CBA联赛之吉林
日期:2016-04-18 14:43:1015-16赛季CBA联赛之北控
日期:2016-05-18 15:01:4415-16赛季CBA联赛之上海
日期:2016-06-22 18:00:1315-16赛季CBA联赛之八一
日期:2016-06-25 11:02:2215-16赛季CBA联赛之佛山
日期:2016-08-17 22:48:2615-16赛季CBA联赛之福建
日期:2016-12-27 22:39:272016科比退役纪念章
日期:2017-02-08 23:49:4315-16赛季CBA联赛之八一
日期:2017-02-16 01:05:3415-16赛季CBA联赛之山东
日期:2017-02-22 15:34:5615-16赛季CBA联赛之上海
日期:2017-11-25 16:17:5015-16赛季CBA联赛之四川
日期:2016-01-17 18:38:37
发表于 2007-11-26 15:49 |显示全部楼层

回复 #9 galaxywar 的帖子

原帖由 galaxywar 于 2007-11-26 15:16 发表

你的方法是可行的,可以处理那些内容比较简单,特别是字段之间没有依赖的情况。
我见过的别的做法都比较相似,每个结构体都写一个serialize函数,有嵌套指针的时候就直接调那个结构体的serialize函数。跟重载 ...


理论上编译器应该可以自动生成这个serialize函数,好像开发下一代 C++  编译器的大师们正在讨论相关问题。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP