下面是我写的一个类,我要将这个类序列化。但是每当从文件中读取该类的时候总是报错:文件含有非预期的对象。主要问题出在了CWordNodeList m_NodeList;上,如果该列表中有元素则序列化出错。有什么办法来解决这个问题?class CWordNode;typedef CTypedPtrList<CObList,CWordNode*> CWordNodeList;class CWordNode : public CObject  
{
DECLARE_SERIAL(CWordNode)
public:
CWordNode();
virtual ~CWordNode(); CWordNodeList m_NodeList;
CString      m_NodeName;
CStringArray m_WordList; virtual void Serialize(CArchive& ar);
};序列化代码void CWordNode::Serialize(CArchive& ar)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
ASSERT_VALID(this); if(ar.IsStoring())
{
ar << m_NodeName;
}
else
{
ar >> m_NodeName;
}
m_WordList.Serialize(ar);
m_NodeList.Serialize(ar);
CObject::Serialize(ar);
}

解决方案 »

  1.   

    CWordNodeList m_NodeList;
    CStringArray m_WordList;
    两个容器包容的对象 的序列化对象 还要你自己写。
    最好就是自己 一个一个取出来 ,序列化。。
       这样 clist carray 是不会给你自己读写文件的
      

  2.   

    好像CList 和CArray可以自己实现序列化的,问题原因出在了m_NodeList这个链表内的对象的类型就是这个类本身,因此出错。我曾经在另外的程序中发现,如果在对包含有子元素的对象序列化前,先执行一个子对象链表为空的对象的序列化,程序就可以正常进行。CArray没有问题,可以完成子对象的序列化。
      

  3.   

    CWordNodeList m_NodeList
    你做了序列化了吗
      

  4.   

    好象有个逻辑错误,序列化时CWordNode和CWordNodeList递归调用,序列化了N次,不错才怪!
      

  5.   

    CWordNodeList m_NodeList,我是利用m_WordList.Serialize(ar);来完成序列化的呀,因为CObList本身是支持序列化的。关键是,我非常奇怪,如果我的程序执行的顺序是这样的话,程序可以正常:
        1、序列化一个不含有子列表的对象;
        2、序列化一个包含子列表的对象;但如果先序列化一个包含子列表的对象时程序就出错了。也就是说在不改变类的定义和实现的情况下,执行顺序的不同会产生不同的效果。我觉得好像我需要作一些附加的工作,才能让直接序列化含有子对列表的对象。
      

  6.   

    谢谢大家的帮助。E17(守护星) 的说法有一些道理,但是CStringArray自己可以实现序列化,CWordNodeList需要自己写序列化。xiaoshao_0_0(xiaoshao) 的提示也很正确。这样修改后可以工作了。void CWordNode::Serialize(CArchive& ar)
    {
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    ASSERT_VALID(this); CObject::Serialize(ar); if(ar.IsStoring())
    {
    ar << m_NodeName; int i_count;
    i_count = m_NodeList.GetCount();
    ar << i_count; POSITION pos;
    pos = m_NodeList.GetHeadPosition();
    CWordNode* pNode;
    while(pos)
    {
    pNode = m_NodeList.GetNext(pos);
    pNode->Serialize(ar);
    }
    }
    else
    {
    ar >> m_NodeName; m_NodeList.RemoveAll();
    int i_count;
    ar >> i_count; for(int j = 0; j < i_count;j++)
    {
    CWordNode* pNode = new CWordNode;
    pNode->Serialize(ar);
    m_NodeList.AddTail(pNode);
    }
    }
    m_WordList.Serialize(ar);
    }