class MyObject:public CBase
{
public:
static MyObject* NewL();
static MyObject* NewLC();
// ~MyObject();
public:
void SetName(const TDes& name);
TDes GetName()const;
void SetId(TUint id);
TUint GetID()const;
void SetValue(TInt value);
TInt GetValue()const;
private:
void Construct();
MyObject();
public:
//这两个方法必有实现,主要用于读和写整个对象时,
//通过调用这个两个方法实现对象内部数据的读或者写操作
void ExternalizeL(RWriteStream& aStream) const;
void InternalizeL(RReadStream& aStream);
private:
TBuf<100> iClassName;
TUint16 id;
TInt32 value;
};
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//implement....................................................................................................//
MyObject::MyObject():id(0),value(0)
{
iClassName.Zero();
}
MyObject* MyObject::NewL()
{
MyObject* self=MyObject::NewLC();
CleanupStack::Pop(self);
return self;
}
MyObject* MyObject::NewLC()
{
MyObject* self=new (ELeave) MyObject;
CleanupStack::PushL(self);
self->Construct();
return self;
}
void MyObject::Construct()
{
}
void MyObject::SetName(const TDes& name)
{
iClassName=name;
}
TDes MyObject::GetName()const
{
return iClassName;
}
void MyObject::SetId(TUint id)
{
this->id=id;
}
TUint MyObject::GetID()const
{
return id;
}
void MyObject::SetValue(TInt value)
{
this->value=value;
}
TInt MyObject::GetValue()const
{
return value;
}
void MyObject::ExternalizeL(RWriteStream& aStream) const
{
aStream.WriteUint16L(id);
aStream.WriteInt32L(value);
aStream<<iClassName;
}
void MyObject::InternalizeL(RReadStream& aStream)
{
id=aStream.ReadUint16L();
value=aStream.ReadInt32L();
aStream>>iClassName;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//使用示例:
_LIT(KFileName,"c://test//file.dat");
//存于对象数据(序列化对象)
void StoreObject()
{
MyObject* obj=MyObject::NewLC();
obj->SetId(101);
_LIT(KContent,"myClassString");
TBuf<100> buf=KContent;
obj->SetName(buf);
obj->SetValue(100000);
RFs fs;
fs.Connect();
fs.MkDirAll(KFileName);
TParse parser;
fs.Parse(KFileName,parser);
CFileStore* store=CDirectFileStore::ReplaceLC(fs,parser.FullName(),EFileWrite);
store->SetTypeL(KDirectFileStoreLayoutUid);
RStoreWriteStream outStream;
TStreamId id=outStream.CreateLC(*store);
outStream<<*obj; //调用obj相应的ExternalizeL(RWriteStream&)方法
outStream.CommitL(); //提交流
CleanupStack::PopAndDestroy(); //clean up self
store->SetRootL(id);
store->CommitL(); //把文件提交到文件系统
// outStream.Close();
CleanupStack::PopAndDestroy(2); //outStreamand store,obj
fs.Close();
}
//读取对象数据(反序列化对象)
void ReStoreObject()
{
MyObject* self=MyObject::NewLC();
RFs fs;
TParse parser;
fs.Connect();
fs.Parse(KFileName,parser);
CFileStore* store=CDirectFileStore::OpenLC(fs,parser.FullName(),EFileRead);
RStoreReadStream reader;
reader.OpenLC(*store,store->Root());
reader>>*self; //调用obj相应的InternalizeL(RReadStream&)方法
iObjName.Copy(self->GetName());
CleanupStack::PopAndDestroy(3); //reader,store,self
fs.Close();
}