1. 程式人生 > >QDataStream實現自定義物件序列化

QDataStream實現自定義物件序列化

專案需求將使用者上一次配置資訊儲存到硬碟上,以便下次使用者直接載入。我是講使用者配置資訊作為一個類存在的,研究了2天QT平臺上的物件序列化問題。C++的序列化問題在VC平臺上實現比較簡單。Java的序列化問題只需要實現seriable介面即可。網上查了幾個QT相關的例子,發現各種錯誤,最大的錯誤就是不能編譯成功。在QT平臺上使用QDataStream作為序列化的輸入輸出流,http://www.kuqin.com/qtdocument/qdatastream.html。文件裡使用Q_INT32作為基本資料型別,但是我在QT平臺上沒有找到Q_INT32的型別,只有qint32,必須使用qint32代替int可以實現基本資料型別int的序列化。
/TEST測試類該類的友元函式 過載》 《
#ifndef TEST_H
#define TEST_H
#include <QString>
typedef struct xx
{
   int x;
   int y;
}XX;
class Test
{
public:
    Test();
    int age;
    QString name;
    XX aa;
    friend QDataStream& operator<<(QDataStream&,Test&);
    friend QDataStream& operator>>(QDataStream&,Test&);
};

#endif // TEST_H
//test的實現類,在友元函式負責將test物件的分解為基本資料型別,然後寫入QDataStream流中。
#include "test.h"
#include "qdatastream.h"
Test::Test()
{
}
QDataStream& operator <<(QDataStream& stream,Test& test)
{
    qint32 tmp = test.age;
    qint32 x = test.aa.x;
    qint32 y = test.aa.y;
    stream<<tmp<<test.name<<x<<y;
    return stream;
}
QDataStream& operator >>(QDataStream& stream,Test& test)
{
    qint32 tmp;
    qint32 x;
    qint32 y;
    XX xx;
    stream>>tmp>>test.name>>x>>y;
    xx.x = x;
    xx.y =y;
    test.age = tmp;
    test.aa = xx;
    return stream;
}
主函式檔案,測試是否寫入成功,併成功讀取磁碟檔案。 
Test test,out;
    test.age = 10;
    test.name="test";
    test.aa.x = 5;
    test.aa.y = 6;
    QFile file("/d.dat");
    file.open(QIODevice::ReadWrite);
    QDataStream stream(&file);
    stream<<test;
    file.close();
    QFile file1("/d.dat");
    file1.open(QIODevice::ReadWrite);
    QDataStream stream1(&file1);
    stream1>>out;
    file1.close();

我對物件序列化問題的理解是:將物件分解為平臺能解析的基本資料型別,然後對基本資料型別進行寫入操作。上例中的結構體XX為測試物件中含有結構體的序列化方法。對於物件中含有陣列的情況,思路為:在儲存物件磁碟檔案中增加一個cout記錄陣列的元素個數(一維陣列一個,多維陣列記錄多個),然後將陣列的元素按行順序寫入到磁碟檔案中,讀取的時候則先讀取陣列的維數和元素個數,然後動態申請記憶體,將元素寫入到記憶體中,將記憶體首地址賦值到物件的陣列地址(即陣列名)。對陣列還沒有進行測試。
這2天浪費時間都花在對平臺的基本資料型別的修正中,比如使用QDataStream 將int直接寫入肯定是不行,使用qint32可以。

相關推薦

QDataStream實現定義物件序列

專案需求將使用者上一次配置資訊儲存到硬碟上,以便下次使用者直接載入。我是講使用者配置資訊作為一個類存在的,研究了2天QT平臺上的物件序列化問題。C++的序列化問題在VC平臺上實現比較簡單。Java的序列化問題只需要實現

定義redis序列工具

我們 utils 字節數 pac keys ted ive onu 問題 redis一個優點就是可以將數據寫入到磁盤中。 我們知道寫入磁盤的數據實際上都是以字節(0101這樣的二進制數據)的形式寫入的。 這意味著如果我們要將一個對象寫入磁盤,就必須將這個對象序列化。 jav

jackson中定義處理序列和反序列

public turn ali fast col ast mar 繼承 con http://jackyrong.iteye.com/blog/2005323 ********************************************** 對於一直用gson的

圖片銜接定義序列

#include <fstream> // include headers that implement a archivein simple text format #include<boost/archive/text_oarchive.hpp> #inclu

定義Hadoop序列been Demo

package hadoop.mapreduce.serializable; import org.apache.hadoop.io.Writable; import java.io.DataInput; import java.io.DataOutput; import

第七十五條 考慮使用定義序列形式

序列化使用起來比價方便,但有一些常見的細節需要注意,比如說定義 serialVersionUID 值,關鍵字 transient 的用法,下面就用例子來說明 定義一個bean,實現序列化的介面, public class Student implements Serializable { &

使用FactoryBean介面實現定義bean初始

使用FactoryBean介面實現自定義bean初始化 本文所要介紹的FactoryBean是Spring中定義的一個介面,當把它的實現類定義為BeanFactory中的一個bean,我們在獲取其對應的bean時實際上獲取的是FactoryBean所包含的那個物件,而不是它本身。我們先來看一下Factor

Netty學習8-定義複雜序列框架

1 概述 《Netty學習7-序列化原理》一文中講述了序列化的原理,通過Java位運算、JDK原生的NIO、Netty的ChannelBuffer做了序列化操作。本文演示稍微複雜的一個自定義序列化框架,但萬變不離其宗,拆解出來還是很簡單的。 2 工具類 這是核心類。拆解來看

SpringBoot2.0 定義Json序列規則(忽略value為null的key序列

最近公司專案重構,發現介面返回的json資料中存在有value值為null 的key,這些應該被視為廢資料,不應該輸出給前端佔用頻寬,於是去修改json序列化的方式,在spring中我們都知道去xml配置檔案中加一行配置或者在輸出模型上加一@JsonInclud

考慮定義序列模式(75)

一個類實現了Serializable 介面,並且使用了預設的序列化形式 無法擺脫該實現,永遠牽制該類的序列化形式 如

為Redis配置定義fastJson序列工具類

    alibaba.fastjson內部已經提供了對Redis儲存物件序列化的工具類GenericFastJsonRedisS

jackson定義全域性序列、反序列

需要自定義Jackson序列化和反序列化有兩種方式,一種是全域性定義,一種是非全域性定義。先來看看全域性定義。全域性定義的步驟如下

原始碼分析springboot定義jackson序列,預設null值個性化處理返回值

  最近專案要實現一種需求,對於後端返回給前端的json格式的一種規範,不允許缺少欄位和欄位值都為null,所以琢磨了一下如何進行將springboot的Jackson序列化自定義一下,先看看如何實現,再去看原始碼 第一步:寫配置類 1 @Configuration 2 public class Web

記錄一次原始碼擴充套件案列——FastJson定義序列ValueMutator

背景:曾經遇到一個很麻煩的事情,就是一個json串中有很多佔位符,需要替換成特定文案。如果將json轉換成物件後,在一個一個屬性去轉換的話就出出現很多冗餘程式碼,不美觀也不是很實用。 而且也不能提前在json串中替換,因為替換的文案會因為某些變數發生改變。就比如國際化,在中文的時候應該是"你好",而在英文的

定義物件實現 MapReduce 框架的序列及排序

如果需要將自定義的 bean 放在 key 中傳輸,則還需要實現 Comparable 介面,因為 MapReduce框中的 shuffle 過程一定會對 key 進行排序,此時,自定義的 bean 實現的介面應該是:public class FlowBean impleme

FastJson定義複雜物件序列

總結:  SerializeFilter是通過程式設計擴充套件的方式定製序列化。fastjson支援6種SerializeFilter,用於不同場景的定製序列化。  PropertyPreFilter 根據PropertyName判斷是否序列化  Pr

[springBoot] Springboot 整合redis並實現定義序列遇到的問題

當我們使用@Cacheable註解的時候會將返回的物件快取起來,我們會發現預設快取的值是二進位制的,不方便檢視,為此我們自定義序列化配置,改成JSON格式的 配置如下: pom.xml <?xml version="1.0" encoding="UTF-8"?&

iOS 之JSON序列的注意(陣列,字典,定義物件序列

注意:要序列化的物件:最外層的物件型別必須是NSArray或NSDictionary;字典的key必須是NSSting型別;數字不能是NAN或無限大;所有的物件型別必須時NString,NSNumber,NSAray,NSDIctionary,NSNull;- (void)v

使用RabbitMQ放置定義物件(不借助序列工具,例如protobuffer)V2.0

如何使用RabbitMQ盛放自定義的物件呢?一般都會使用序列化工具在投放之前轉換一次,從MQ取回的時候再逆序列化還原為本地物件。這裡使用C++自帶的強制型別裝換,將本地物件的記憶體模型當做自然的序列化之後的資料,直接當做位元組流放到string物件中,從MQ取回的時候用同樣

MongoDB 帶JSON類 序列定義物件為Json字串解決方案

今天在使用MongoDB時,需要將自定義的POJO類通過mongoDB自帶的JSON.serialize序列化成一個Json格式的字串,但一直報json don't serialize object異常,又不想使用第三方的jar包,網上到處搜沒搜到。最後看api文件實現Ob