okmmno1 发表于 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里面有没有类似的功能?

zhujiang73 发表于 2007-11-20 10:24

回复 #1 okmmno1 的帖子

原帖由 okmmno1 于 2007-11-20 09:28 发表 http://bbs.chinaunix.net/images/common/back.gif
网络传输过程结构体序列化的问题

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

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

okmmno1 发表于 2007-11-20 10:32

原帖由 zhujiang73 于 2007-11-20 10:24 发表 http://bbs.chinaunix.net/images/common/back.gif


看来像是做“远程调用”,跟我现在做的差不多。:)   在远程调用程序中,我是尽量避免使用含有指针的结构体,如果要用只能自己编程做打包处理。 目前 C/C++ 不支持自动序列化,我想这是因为编译后的执行文件 ...
恩,差不多就是远程调用的概念,但是目前想做的就是,实现一个自动化的概念,有程序自己控制序列化的功能,而不是手工的每次去copy

zhujiang73 发表于 2007-11-20 11:07

回复 #3 okmmno1 的帖子

原帖由 okmmno1 于 2007-11-20 10:32 发表 http://bbs.chinaunix.net/images/common/back.gif

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

需要把函数参数打包,再发送到远端是吗?对于简单类型,和不含有指针的结构体数据,通用指针可以帮你大大简化这一过程,不过遇到含有指针的结构体,必须自己先打包才能处理。可以参考一下我的大作: :mrgreen:   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 程序源码,真正的本人原创。

musics 发表于 2007-11-20 12:19

你还是在每个结构体定义的时候同时定义该结构的序列化函数吧.统一接口.
在纯C中,比如,在结构中加个函数指针,C++中使用一个统一的基类或虚函数,在每个需要远程传输类中都实现该功能.

okmmno1 发表于 2007-11-26 10:49

有没有一种类似corba的实现方式呢?

yuanchengjun 发表于 2007-11-26 14:44

原帖由 okmmno1 于 2007-11-20 09:28 发表 http://bbs.chinaunix.net/images/common/back.gif
网络传输过程结构体序列化的问题

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

这种做法是有问题的。

okmmno1 发表于 2007-11-26 15:04

楼上兄弟,能具体指教一下么?
现在的想法是,在客户端可服务器两个各准备一个文件,里面对各个结构体进行描述,然后再程序运行时,
程序按照文件中的内容对传进的结构体进行内存序列化。

galaxywar 发表于 2007-11-26 15:16

原帖由 okmmno1 于 2007-11-26 15:04 发表 http://bbs.chinaunix.net/images/common/back.gif
楼上兄弟,能具体指教一下么?
现在的想法是,在客户端可服务器两个各准备一个文件,里面对各个结构体进行描述,然后再程序运行时,
程序按照文件中的内容对传进的结构体进行内存序列化。
你的方法是可行的,可以处理那些内容比较简单,特别是字段之间没有依赖的情况。
我见过的别的做法都比较相似,每个结构体都写一个serialize函数,有嵌套指针的时候就直接调那个结构体的serialize函数。跟重载<<,>>思想一样。当然这是C++的做法。如果C的话也差不多,因类所用到的结构体类型在编码时期就是确定的。

zhujiang73 发表于 2007-11-26 15:49

回复 #9 galaxywar 的帖子

原帖由 galaxywar 于 2007-11-26 15:16 发表 http://bbs.chinaunix.net/images/common/back.gif

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

理论上编译器应该可以自动生成这个serialize函数,好像开发下一代 C++编译器的大师们正在讨论相关问题。:)
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 网络传输过程结构体序列化的问题