Symbian 文件流存储简单操作(外化和内化)

本文介绍了一个简单的C++类实现序列化和反序列化的示例,包括如何将对象状态保存到文件中以及从文件中恢复对象状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

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();
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值