zoukankan      html  css  js  c++  java
  • Qt持久性对象进行序列化(同时比较了MFC与Java的方法)

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

    http://cool.worm.blog.163.com/blog/static/64339006200832642918250/
  • 相关阅读:
    JavaBean递归拷贝工具类Dozer
    SpringMVC自定义视图Excel视图和PDF视图
    CentOS7使用firewalld打开关闭防火墙与端口[转]
    区分JS中的undefined,null,"",0和false
    环比同比
    JavaScript 浮点数陷阱及解法
    一致性哈希算法(Consistent Hash)的黑科技
    Lua与C交互简明教程
    Twitter-Snowflake,64位自增ID算法详解
    Hystrix使用入门手册(中文)
  • 原文地址:https://www.cnblogs.com/findumars/p/5169950.html
Copyright © 2011-2022 走看看