ادامه مرحله سی سوم: معرفی و با باینری و سریالیز کردن آبجکن ها
در رابطه با بحث Serialization میتونم اینگونه توضیح دهم که به طور کلی در کامپیوتر و سیستم های ذخیره سازی محتویات فایل ها به صورت های متنی و باینتری ذخیره می شوند.
حالا در حالت عادی یا همان پیشفرض اگر شما طبق مثال زیر رشته ای رو در داخل یک فایل بنویسیم ...
// writing on a text file
#include <iostream>
#include <fstream>
using namespace std;
int main () {
ofstream myfile ("example.txt");
if (myfile.is_open())
{
myfile << "This is a line.\n";
myfile << "This is another line.\n";
myfile.close();
}
else cout << "Unable to open file";
return 0;
}
کاملا به صورت عادی و متنی در فایل مورد نظر ذخیره خواهد شد ولی در حالت باینری تمامی اشیاء به صورت یک حالت منحصر بفرد و خاصی ذخیره می شوند یعنی قبل از ذخیره مستقیم محتویات در فایل اشیاء مورد نظر به صورت Byte stream تبدیل شده و سپس در فایل ذخیره می شود.
ما در کل شاید شنیده باشید دو حالت Serialization و DeSerialization رو در بحث برنامه نویسی و مبحث ذخیره سازی داده ها داریم که به عمل تبدیل آبجکت به صورت باینری همان
Serialization و به عکس آن عمل DeSerialization میگویند.
حالا در این مثال من روشی رو برای خواندن و نوشتن اطلاعات در داخل یک فایل رو به صورت Serialization و
DeSerializationبه کمک کلاس QDataStream توضیح خواهم داد.
یه پروژه از نوع کنسول ایجاد میکنم و میرم سر اصل مطلب...
من میخوام یه متنی رو به صورت زیر وارد کنم ...
C++ 1
C++ 2
C++ 3
و در نهایت نتیجه ذخیره شده در فایل به صورت باینری باشه ! چطور باید عمل کنم به صورت زیر...
#include <QCoreApplication>
#include <QFile>
#include <QString>
#include <QDebug>
#include <QMap>
void SaveObject()
{
int iNum = 64;
QMap<int,QString> iMap;
iMap.insert(1,"C++ ");
iMap.insert(2,"C++ 2");
iMap.insert(3,"C++ 3");
//Save to file.
QFile iFile("c:/Test/itest.txt");
if(!iFile.open(QIODevice::WriteOnly))
{
qDebug() << "Could not open file !";
return;
}
QDataStream iOut (&iFile);
iOut.setVersion(QDataStream::Qt_5_2);
iOut << iNum << iMap;
iFile.flush();
iFile.close();
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
SaveObject();
return a.exec();
}
ابتدا هیدر های QFile , QString و QMap رو فراخوانی میکنم چون هدفم نوشتن در داخل یک فایل هستش از مدل QIODevice::WriteOnly استفاده کردم.
بعد اومدم یک تابع تعریف کردم که ابتدا به صورت سلیقه ای یک نوع صحیح در نظر گرفتم برای اینکه میخوام همراه با متن مورد نظرم مخلوط بشه و دنبال اون یک نوع رشته ای از نوع Qmap لیست ساختم و یک سری اطلاعات رو به صورت لیست ایجاد کردم.
توسط دستور زیر یک کپی از کلاس QFile گرفتم و مسیر مورد نظرم رو برای ذخیره سازی محتوا در فایل رو دادم...
QFile iFile("c:/Test/itest.txt");
دستور بعدیش یک شرط تعریف کردم که اقا اگه فایل باز نشد پیغام فلان رو بده د رغیر اینصورت برو ادامه مراحل... البته دقت کنید که چون قصدم نوشتن در فایل هست از
اصلی ترین قسمتش QDataStream هست که وظیفه این کلاس فراهم کردن امکان انتقال داده های باینری رو به مجرای QIODevice میده که اینجا من یک کپی ازش ساختم و گفتم فایلم رو در نظر بگیر و بر اساس نسخه تعیین شده که اینجا من از 5.2 خود Qt استفاده کردم رو بهش اختصاص دادم که اصولا از نسخه های اولیه Qt_1_0 بگیرید برید تا Qt_5_3 که الان هست در لیستم موجوده میتونم استفاده کنم.
خب در خط بعدیش گفتم iNum رو که از نوع عدد صحیح هستش رو همراه با iMap مخطول و در iOut بریز که به ترتیب اولویت از راست به چپ وارد خواهد شد.
در خط بعدی فلاش زدم که در پست های قبلی توضیح دادم کارش چیه و در نهایت فایل رو بعد از نوشتن و فلاش بستمش.
نتیجه باید در مسیر ذکر شده به صورت باینری ذخیره شده باشه !!! به صورت ضمیمه شده میتونید دریافت و بررسیش کنید فقط مسیر فایل رو طبق شرایط خودتون تغییر بدین.
طبق تصویر مشاهده میکنید که اطلاعات به صورت باینری ذخیره شده است ...
نتیجه خروجی حاصل مخلوط شدن متن و اون عددی هستش که اون بالا تعریف کردم یعنی 64.