登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

vic.MINg的博客

 
 
 

日志

 
 

Qt持久性对象进行序列化  

2008-04-26 16:29:18|  分类: Qt |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

Mfc和Java中自定义类的对象都可以对其进行持久性保存,Qt持久性对象进行序列化当然也是必不可少的。
不过这个问题还真困扰了我很长时间……
Mfc通过重写虚函数Serialize()、Java则是所属的类必须实现java.io.Serializable或Externalizable接口完成、
Qt是怎么搞定这个事情那,QDataStream类:让我们不禁想起Mfc中的CAchive类、
Java中的java.io.ObjectOutputStream/ObjectInputStream类,分别提供了对象的序列化和反序列化功能。
现在还差什么了,那就是">>"和"<<"的实现了。
哈哈,c++中friend友员派上用场了。假设你的类是QSampleData,实现以下俩个函数就可以了
    #ifndef QT_NO_DATASTREAM
        friend QDataStream& operator>>(QDataStream&, QSampleData&);
        friend QDataStream& operator<<(QDataStream&, QSampleData&);
    #endif
当时这里不能忽略的事就是,QSampleData从QObject直接或间接派生,有个不带参数的构造函数,这都是老生常谈了~


一个例子,这也是必须的。

//比较懒,这次的注释就免了...
class QSampleData : public QObject

public:
    QChunnelData();
    virtual ~QChunnelData();
    QChunnelData& operator=(const QChunnelData &other);

#ifndef QT_NO_DATASTREAM
    friend QDataStream& operator>>(QDataStream&, QChunnelData&);
    friend QDataStream& operator<<(QDataStream&, QChunnelData&);
#endif 
    //定义的数据成员
    int m_nType;
    QString m_strName;
};

 
CSampleData::CSampleData()
{
    m_nType = 0;
    m_strName = "";
}
CSampleData::~CSampleData()
{
}
CSampleData::operator =(const CSampleData& other)
{
    m_nType = other.m_nType;
    m_strName = other.m_strName;
    return *this;
}
#ifndef QT_NO_DATASTREAM
QDataStream& operator>>(QDataStream& in, CSampleData& data)
{
    in >> data.m_nType >> data.m_strName;
    return in;
}
QDataStream& operator<<(QDataStream& out, CSampleData& data)
{
    out << data.m_nType << data.m_strName;
    return out;
}
#endif

这样就QFile、QByteArray...可以关联QDataStream类的对象,进行读写操作了。

QSampleData data;
data.m_nTpye = 12;
data.m_strName = "vic.MINg";
QFile file("file.dat");
file.open(QIODevice::WriteOnly);
QDataStream out(&file);
out << data;
file.close();
file.open(QIODevice::ReadOnly);
QDataStream in(&file);
in >> data;
file.close();

  评论这张
 
阅读(5588)| 评论(1)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018