W***o 发帖数: 6519 | 1 最近可能需要写一个serialization/deserialization的code, 是要把一个C里面的
struct保存信息,然后远程传输,再deserialization,运行。比如我的struct是这样:
typedef struct my_data {
char *data;
int *user_array;
int written_by;
int user_array_size;
} my_data;
上面的user_array这个field是一个动态数组,data这个field要保存大量的字符串。请
教一下,该如何serialize/deserialize? 是不是需要用 fopen, fwrite 之类的把 数
据写到一个file里面,利用指针控制fwrite()的位置?
谢谢指教 |
A*****i 发帖数: 3587 | 2 C来做这个有些蛋疼吧……
这种东西java不是有自带的lib么 |
W***o 发帖数: 6519 | 3 必须用c写,作业要求
【在 A*****i 的大作中提到】 : C来做这个有些蛋疼吧…… : 这种东西java不是有自带的lib么
|
d*******r 发帖数: 3299 | 4 C 就是用来干这个的呀,这个是协议打包的网络程序。
简单说,就是内存或者硬盘其实都是一个长长的一维数组,你要在上面申请一段连续空
间(或者更复杂,一个链表),把你的数据 (e.g. data 指针指向的 buffer 里的数据写
进去)。然后,在接受端,你再按照你存储的格式,把数据导来。
你可以在这个struct后面加一个buffer field,存数据,用 memcpy之类的函数把数据
copy 进去,用一个指针存起始地址, 还有个变量存数据buffer field 的长度。然后用
TCP socket 把整个 struct 传过去。
或者你们要求是把数据存到 file 里面,然后传输 file (e.g. scp?)?
样:
【在 W***o 的大作中提到】 : 最近可能需要写一个serialization/deserialization的code, 是要把一个C里面的 : struct保存信息,然后远程传输,再deserialization,运行。比如我的struct是这样: : typedef struct my_data { : char *data; : int *user_array; : int written_by; : int user_array_size; : } my_data; : 上面的user_array这个field是一个动态数组,data这个field要保存大量的字符串。请 : 教一下,该如何serialize/deserialize? 是不是需要用 fopen, fwrite 之类的把 数
|
x****u 发帖数: 44466 | 5 这种东西最好不要重新发明轮子。
样:
【在 W***o 的大作中提到】 : 最近可能需要写一个serialization/deserialization的code, 是要把一个C里面的 : struct保存信息,然后远程传输,再deserialization,运行。比如我的struct是这样: : typedef struct my_data { : char *data; : int *user_array; : int written_by; : int user_array_size; : } my_data; : 上面的user_array这个field是一个动态数组,data这个field要保存大量的字符串。请 : 教一下,该如何serialize/deserialize? 是不是需要用 fopen, fwrite 之类的把 数
|
f**********3 发帖数: 295 | 6 楼主说了是作业
【在 x****u 的大作中提到】 : 这种东西最好不要重新发明轮子。 : : 样:
|
d****i 发帖数: 4809 | 7 这个一直以来就是C做的啊,Java自带的lib底层就是C的实现啊。
【在 A*****i 的大作中提到】 : C来做这个有些蛋疼吧…… : 这种东西java不是有自带的lib么
|
g*********e 发帖数: 14401 | 8 [长度][内容][长度][内容]
然后写到文件里,读取的时候同理 |
W***o 发帖数: 6519 | 9 开始有点眉目了。
用fwrite 写 binary
然后用fread 读,根据数字判断读入的长度,再在memory里复原struct
谢谢指点!
【在 g*********e 的大作中提到】 : [长度][内容][长度][内容] : 然后写到文件里,读取的时候同理
|
W***o 发帖数: 6519 | 10 谢谢指点
据
用
【在 d*******r 的大作中提到】 : C 就是用来干这个的呀,这个是协议打包的网络程序。 : 简单说,就是内存或者硬盘其实都是一个长长的一维数组,你要在上面申请一段连续空 : 间(或者更复杂,一个链表),把你的数据 (e.g. data 指针指向的 buffer 里的数据写 : 进去)。然后,在接受端,你再按照你存储的格式,把数据导来。 : 你可以在这个struct后面加一个buffer field,存数据,用 memcpy之类的函数把数据 : copy 进去,用一个指针存起始地址, 还有个变量存数据buffer field 的长度。然后用 : TCP socket 把整个 struct 传过去。 : 或者你们要求是把数据存到 file 里面,然后传输 file (e.g. scp?)? : : 样:
|
|
|
d****i 发帖数: 4809 | 11 有一点注意的是:要注意endianness和compiler padding,这个会导致在不同的
architecture上字节大小和顺序的不同。
【在 W***o 的大作中提到】 : 开始有点眉目了。 : 用fwrite 写 binary : 然后用fread 读,根据数字判断读入的长度,再在memory里复原struct : 谢谢指点!
|
W***o 发帖数: 6519 | 12 再次谢谢各位,我写的serialize() function 已经work了,但是现在deserialize()
碰到一点麻烦,我把我的问题也在SO上贴了,如果哪位大侠有时间请帮忙看一下:
http://stackoverflow.com/questions/23095048/how-to-correctly-us
主要问题是在fread()的时候不太明白怎么控制指针;
谢谢了
【在 d****i 的大作中提到】 : 有一点注意的是:要注意endianness和compiler padding,这个会导致在不同的 : architecture上字节大小和顺序的不同。
|
S**********e 发帖数: 503 | 13 endianness好处理。compiler padding怎么判断、处理?
【在 d****i 的大作中提到】 : 有一点注意的是:要注意endianness和compiler padding,这个会导致在不同的 : architecture上字节大小和顺序的不同。
|
d****i 发帖数: 4809 | 14 一个简单的方法来判断
#include
struct A {
int a;
short b;
char c;
};
#pragma pack (1)
struct B {
int a;
short b;
char c;
};
int main(int argc, char *argv[])
{
int size_A = sizeof(struct A), size_B = sizeof(struct B);
int size_sum = sizeof(int) + sizeof(short) + sizeof(char);
printf("siza_A=%d, size_B=%d, size_sum=%d\n", size_A, size_B, size_sum);
if(size_A > size_sum && size_B == size_sum) {
printf("The compiler pads the struct to be byte aligned.\n");
} else {
printf("The compiler does nothing.\n");
}
}
【在 S**********e 的大作中提到】 : endianness好处理。compiler padding怎么判断、处理?
|
a9 发帖数: 21638 | 15 这个结构不用对齐吧,呵呵。
);
【在 d****i 的大作中提到】 : 一个简单的方法来判断 : #include : struct A { : int a; : short b; : char c; : }; : #pragma pack (1) : struct B { : int a;
|
d*******r 发帖数: 3299 | 16 设计 struct 的时候就做好 padding ,排好各个 fields 的位置呀
【在 S**********e 的大作中提到】 : endianness好处理。compiler padding怎么判断、处理?
|
Y**G 发帖数: 1089 | 17 有一种东西叫Google Protocol Buffer。
https://developers.google.com/protocol-buffers/docs/reference/cpp/
样:
【在 W***o 的大作中提到】 : 最近可能需要写一个serialization/deserialization的code, 是要把一个C里面的 : struct保存信息,然后远程传输,再deserialization,运行。比如我的struct是这样: : typedef struct my_data { : char *data; : int *user_array; : int written_by; : int user_array_size; : } my_data; : 上面的user_array这个field是一个动态数组,data这个field要保存大量的字符串。请 : 教一下,该如何serialize/deserialize? 是不是需要用 fopen, fwrite 之类的把 数
|