Serialize反序列化如何遍历存储在文件中的所有对象

dahaiI0 2011-09-18 05:36:25
可序列化的对象CDataInfo,有个CString成员变量m_csID(还有其他些变量),序列化存储到文件,在读取数据时我想获取到文件里m_csID值为"123456"的对象的信息,该如何获取

CDataInfo info;
CFile file;
file.Open(_T("D:\\2.txt"),CFile::modeRead);
CArchive ar(&file,CArchive::load);
for (int i = 0;i<10;i++)
{
info.Serialize(ar);
MessageBox(info.m_csID);
ar.Close();
file.Close();
}

这种循环遍历如果遍历次数超过存储的对象个数对报错:试图越过其尾端对一个未命名的文件进行读写。

问题2:如果m_csID(CString)存储的字符串有几十M会不会有问题,顺带问下,CFile::write,CFile::read,fread,fwrite这些API一次最多读写多少数据(人懒不想循环读写)是不是这些API中表示缓冲区大小的那个参数类型的最大值?比如CFile::Write(
const void* lpBuf,
UINT nCount
);是不是最大4G?但是socket里的send,recv一次最多(或者说一般读写的数据量)好像并不是参数的最大值
...全文
452 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
dahaiI0 2011-09-19
  • 打赏
  • 举报
回复
自己顶下。。。。
dahaiI0 2011-09-19
  • 打赏
  • 举报
回复
还是反序列化的问题,假设上次序列化进文件的对象有2个,第二次运行程序,再存储一个对象,这时文件存了3个对象(序列化2次),但是CObArray反序列化只能得到最近一次序列化的对象,也就是说CObArray反序列化得到的只有1个对象,最先存储的2个对象无法获取到。。这种情况怎么办
dahaiI0 2011-09-19
  • 打赏
  • 举报
回复
怪事了,同样的代码昨天在家试不行,今天跑到公司又可以了。这个暂时到此为止,下个
-----------------------------------------------------------
如果m_csID(CString)存储的字符串有几十M会不会有问题(定义CArchive对象时重新动态分配了内存),顺带问下,CFile::write,CFile::read,fread,fwrite这些API一次最多读写多少数据(人懒不想循环读写)是不是这些API中表示缓冲区大小的那个参数类型的最大值?比如CFile::Write(
const void* lpBuf,
UINT nCount
);是不是最大4G?但是socket里的send,recv一次最多(或者说一般读写的数据量)好像并不是参数的最大值
uncle_bacon 2011-09-19
  • 打赏
  • 举报
回复
从Cobject继承来的,pinfo->Serialize(ar); 可以序列化和反序列化,但操作CObArray的Serialize却不可以。。
dahaiI0 2011-09-19
  • 打赏
  • 举报
回复
回楼上,是从Cobject继承来的,pinfo->Serialize(ar); 可以序列化和反序列化,但操作CObArray的Serialize却不可以。。
fyzh84 2011-09-19
  • 打赏
  • 举报
回复
你遇到的这问题可能是你的类CDataInfo不是从Cobject中继承下来的,只有从Cobject继承下来的类才拥有序列化能力,所以你需要将你的CDataInfolei 继承自Cobject,然后再重载Cobject的Searialize函数。因为CobArray中的对象要调用你自己类中的Serialize函数的。
dahaiI0 2011-09-19
  • 打赏
  • 举报
回复
大清早自己顶下。。
dllg1988 2011-09-19
  • 打赏
  • 举报
回复
没找到什么资料自己慢慢磨,真痛苦,如果是用对象循环反序列,则写入数据,打开文件时需要把文件指针指向文件末尾file.SeekToEnd(),不然循环中只会得到第一次写入的数据。而用CObArray反序列化只得到最后次反序列,那是因为用CObArray反序列时不需要把文件指针指向末尾file.SeekToEnd(),这句加了就不对了。看来还是基础差啊。没人回答自己回答下。
dahaiI0 2011-09-18
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 fyzh84 的回复:]
类的序列化是MFC提供的非常有用的特性之一,你所遇到的问题,我有一条思路。
你的第一个问题是关于对象超出了所存储的个数了,会出现异常,你需要的是将你的对象放在一个动态的数组中进行管理,例如CtypedPtrArray,这也是MFC提供的,庆幸的是你可以直接对着他Serialize,你在这个数组中管理的所有对象将会全部被写入文件中,当你要读出了的时候,你是在对数组反序列化,你根本不用担心超界这个问……
[/Quote]
我定义一个CObArray m_obArray;把对象加进去,执行序列化时弹出错误:试图执行系统不支持的操作

CDataInfo *pinfo = new CDataInfo();
...给成员赋值
m_obArray.Add(pinfo);
m_obArray.Serialize(ar);

求解。。
chunyou128 2011-09-18
  • 打赏
  • 举报
回复
http://vckbase.com/document/viewdoc/?id=1871
fyzh84 2011-09-18
  • 打赏
  • 举报
回复
类的序列化是MFC提供的非常有用的特性之一,你所遇到的问题,我有一条思路。
你的第一个问题是关于对象超出了所存储的个数了,会出现异常,你需要的是将你的对象放在一个动态的数组中进行管理,例如CtypedPtrArray,这也是MFC提供的,庆幸的是你可以直接对着他Serialize,你在这个数组中管理的所有对象将会全部被写入文件中,当你要读出了的时候,你是在对数组反序列化,你根本不用担心超界这个问题。
dahaiI0 2011-09-18
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 sky101010ws 的回复:]
序列化和反序列化都已经对一些基础的类型做过重载
所以你不用关心的
当你自定义的类型你要进行序列和反序列化时
要自己将自定义类型拆分成普通类型就可以了
[/Quote]
好吧,虽然可能你只看了帖子标题,但还是感谢你的回答。
dahaiI0 2011-09-18
  • 打赏
  • 举报
回复
对于第一个问题搜了下解决方法,
1:对读取文件内容的代码捕获异常
2:保存存储的对象个数。我的做法是在创建CArchive 对象前用CFile::write,read读写对象个数,然后再序列化对象,但是打开文件都是乱码,虽然能读取到正确内容,不知道这样做对不对。
周末都没人么,来个人指点下。。。3Q
龙行天下之Sky 2011-09-18
  • 打赏
  • 举报
回复
序列化和反序列化都已经对一些基础的类型做过重载
所以你不用关心的
当你自定义的类型你要进行序列和反序列化时
要自己将自定义类型拆分成普通类型就可以了

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧