QDataStream實現自定義物件序列化
/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