由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - serialization 到底该怎么理解啊?
相关主题
Boost.Serialization no longer maintained?python pickle 目的是什么
请教一个命名的问题Java question
fread/fwrite有big/small endian问题吗?问一道有关C++ (de)serialization的问题,谢谢!
ask a question about struct in C programmingreinterpret cast的问题
有没有现成的模拟fread的bufferRead()?Does C++ have serializer and deserialzier
protobuf 能serialize Float.NaN 么?c的文件写入问题
vert.x 下使用ORM的疑问a linux disk IO question (转载)
java里是不是要避免用clone()有人说clone() is broken. 求助:关于文件夹和文件的读写
相关话题的讨论汇总
话题: struct话题: size话题: int话题: sizeof
进入Programming版参与讨论
1 (共1页)
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?)?
:
: 样:

相关主题
protobuf 能serialize Float.NaN 么?python pickle 目的是什么
vert.x 下使用ORM的疑问Java question
java里是不是要避免用clone()有人说clone() is broken.问一道有关C++ (de)serialization的问题,谢谢!
进入Programming版参与讨论
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 之类的把 数

1 (共1页)
进入Programming版参与讨论
相关主题
求助:关于文件夹和文件的读写有没有现成的模拟fread的bufferRead()?
fwrite()有参数可以优化么?protobuf 能serialize Float.NaN 么?
发现自己写buffer还是能加速fwrite的vert.x 下使用ORM的疑问
c++产生随机数java里是不是要避免用clone()有人说clone() is broken.
Boost.Serialization no longer maintained?python pickle 目的是什么
请教一个命名的问题Java question
fread/fwrite有big/small endian问题吗?问一道有关C++ (de)serialization的问题,谢谢!
ask a question about struct in C programmingreinterpret cast的问题
相关话题的讨论汇总
话题: struct话题: size话题: int话题: sizeof