hur.cn - 华软网

 热门搜索

CList 的序列化问题

  作者:未知    来源:网络    更新时间:2009/9/18
C++">
Kind k11;
k11.m_name=_T("kind1");
k11.m_value=11.0;

Kind k12;
k12.m_name=_T("kind2");
k12.m_value=12.0;

Feature f1;
f1.kindList.AddTail(&k11);
f1.kindList.AddTail(&k12);
f1.m_count=f1.kindList.GetCount();


Feature f2;
f2.kindList.AddTail(&k11);
f2.kindList.AddTail(&k12);
f2.m_count=f2.kindList.GetCount();

CList<Feature> featureList;
featureList.AddTail(f1);
featureList.AddTail(f2);


//把featureList写入资料
CFile output(_T("1.txt"),CFile::modeCreate|CFile::modeWrite);
CArchive ar(&output, CArchive::store);
if(ar.IsStoring())
{
ar<<featureList;//在这一句上报错
}
ar.Close();
output.Close();

CList<Feature> secondList;
CFile input(_T("1.txt"),CFile::modeRead);
CArchive in(&input,CArchive::load);
if(in.IsLoading())
{
in>>secondList;
}
in.Close();
input.Close();


error C2678: 二进制“<<”: 没有找到接受“CArchive”类型的左操作数的运算符(或没有可接受的转换)


Feature 已经实现了序列化。
Feature.h
C++">#pragma once
#include "afxtempl.h"
#include "Kind.h"
class Feature:public CObject
{
DECLARE_SERIAL(Feature)
public:
Feature(void);
~Feature(void);
CString m_name;
CList<Kind*> kindList;
void Serialize(CArchive& ar);
void operator = (const Feature &parameter);
int m_count;
};


Feature.cpp
C++">#include "StdAfx.h"
#include "Feature.h"

IMPLEMENT_SERIAL(Feature,CObject,1)
Feature::Feature(void)
: m_name(_T(""))
, m_count(0)
{
}

Feature::~Feature(void)
{
}

void Feature::Serialize(CArchive& ar)
{
//CObject::Serialize(ar);
if (ar.IsStoring())
{
// 存储长期性对象到档案
ar<<m_name;
ar<<m_count;
POSITION   pos   =   this->kindList.GetHeadPosition();
while(pos   !=   NULL)
{
Kind *ptr = kindList.GetNext(pos);
ar<<ptr->m_name<<ptr->m_value;

}
else
{
// 从档案装载长期性对象

ar>>m_name;
ar>>m_count;
for(int i=0;i<m_count;i++)
{
Kind tempKind;
ar>>tempKind.m_name>>tempKind.m_value;
kindList.AddTail(&tempKind);
}

}
}
void Feature::operator =(const Feature &parameter)
{
this->m_name=parameter.m_name;
this->m_count=parameter.m_count;
//在这里遍历list parameter把内容拷贝到kindList里
POSITION p=parameter.kindList.GetHeadPosition();
while(p!=NULL)
{
this->kindList.AddTail(parameter.kindList.GetNext(p));
}
}

---华软 网友回答---
由于CArchieve没有针对CList的<< >>重载,所以不能直接运用操作符,改成直接调用Serialize函数。
ar << featureList;
featureList.Serialize(ar);
---华软网友回复---
 if(ar.IsStoring())
        {
            ar<<featureList;//在这一句上报错
        }
整段替换为
featureList.Serialize(ar);
---华软网友回复---
谢谢jameshooo还在关注我这个问题。
ar < <featureList;//在这一句上报错 

这句改成
featureList.Serialize(ar);
了,
在读取的时候又报错了,
 if(in.IsLoading())
        {
            in>>secondList;
        }

 二进制“>>”: 没有找到接受“CList<TYPE>”类型的右操作数的运算符(或没有可接受的转换)

“CArchieve没有针对CList的 < < >>重载”
读取的时候怎么把数据从资料反序列化到list.
---华软网友回复---
一样的代码,改成secondList.Serialize(in); 就能够了
---华软网友回复---

//把featureList写入资料  
CFile output(_T("1.txt"),CFile::modeCreate|CFile::modeWrite); 
CArchive ar(&output, CArchive::store); 
featureList.Serialize(ar); // 不需要 if 判断
ar.Close(); 
output.Close(); 

CList<Feature> secondList; 
CFile input(_T("1.txt"),CFile::modeRead); 
CArchive in(&input,CArchive::load); 
secondList.Serialize(in); // 不需要 if 判断,由于in自身是用 CArchive::load 初始化的
in.Close(); 
input.Close();


---华软网友回复---
引用 4 楼 jameshooo 的回复:
一样的代码,改成secondList.Serialize(in); 就能够了

谢谢了,编译通过了,运行的时候出现 了一个毛病
abc.exe 遇到问题需要关闭。咱们对此引起的不便表示负疚。
可能指针读取的时候出的错。我先看看,搞不出来的话再问
---华软网友回复---
引用 5 楼 jameshooo 的回复:
C/C++ code//把featureList写入资料CFile output(_T("1.txt"),CFile::modeCreate|CFile::modeWrite); 
CArchive ar(&output, CArchive::store); 
featureList.Serialize(ar);// 不需要 if 判断ar.Close(); 
output.Close(); 

¡­

嗯 
---华软网友回复---
毛病还没找出来,
debug了一下
	CFile output(_T("1.txt"),CFile::modeCreate|CFile::modeWrite);
CArchive ar(&output, CArchive::store);
featureList.Serialize(ar);

ar.Close();
output.Close();

CList<Feature> secondList;
CFile input(_T("1.txt"),CFile::modeRead);
CArchive in(&input,CArchive::load);
secondList.Serialize(in);

in.Close();//在执行这句的时候出现的问题
input.Close();


跟进去 之后 就进了类库CList的removeAll()方法这里。


void CList<TYPE, ARG_TYPE>::RemoveAll()
{
ASSERT_VALID(this);

// destroy elements
CNode* pNode;
for (pNode = m_pNodeHead; pNode != NULL; pNode = pNode->pNext)//在这里出的问题
pNode->data.~TYPE();

m_nCount = 0;
m_pNodeHead = m_pNodeTail = m_pNodeFree = NULL;
m_pBlocks->FreeDataChain();
m_pBlocks = NULL;
}

不知道 为什么,大家帮助看看。
---华软网友回复---
学习一下,我也正在研讨此题。
---华软网友回复---
如果是这样改,那还增加DECLARE_SERIAL(Feature)干什么,还集成CObject干什么,为了增加代码量?      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。