PDA

View Full Version : سوال: سریالایز کردن



python_85
شنبه 26 تیر 1389, 13:41 عصر
سلام
چه جوری میشه یه کلاس رو تو حافظه سریالایز کرد.
من می خوام یه کلاس رو مثلا به QByteArray تبدیل کنم و بعد روی شبکه بفرستم

python_85
شنبه 26 تیر 1389, 14:48 عصر
من با QVariant کلاس رو تیدیل کردم
اما مقداری که تو QByteArray هست رو که دوباره بر میگردونم به کلاس اولیم انگار هیچی توش نبوده



MyClass obj(1.0f,100.0f,5.0f);
//this->ui->pushButton->setText(QVariant(obj.x).toString());
QVariant vs;
vs.setValue(obj);
QByteArray vsb=vs.toByteArray();
//QString s=vs.toString();
qDebug("Data=");
//qDebug(vsb.data());
QVariant testVar( vsb );
MyClass testVs = testVar.value< MyClass >();
this->ui->pushButton->setText(QVariant(testVs.x).toString());


اگه رشته باشه خالیه اگه عدد باشه صفر بر میگردونه

eshpilen
یک شنبه 27 تیر 1389, 17:33 عصر
تصور میکنم علت وجود و کاربرد QVariant چیز دیگری باشه.
درمورد متد toByteArray هم ظاهرا در رفرنس نوشته که درصورتیکه نوع داده از ابتدا QByteArray یا QString باشه اون رو دوباره به این فرمت تبدیل میکنه.
فکر میکنم شما تصور غلطی درمورد QVariant دارید و مسیر کاملا غلطی رو رفتید.

اونطور که درمورد سریالایز کردن اشیاء کیوت در اینترنت الان جستجو کردم و نتایجی رو دیدم، کلاس QDataStream به مفهوم مورد نظر خیلی نزدیک تر هست.
و از رفرنس و منابع دیگر بنظر میرسه که تنها انواع استاندارد سی++ و چند نوع محدود از کلاسهای کیوت رو ساپورت میکنه، ولی نه یک کلاس که شما خودتون تعریف کرده باشید و نه بیشتر کلاسهای کیوت رو.
در این صفحه انواع ساپورت شده توسط این کلاس رو میتونید ببینید:
http://doc.trolltech.com/4.5/datastreamformat.html
اینم بخشی از توضیحات رفرنسش:


The QDataStream class implements the serialization of C++‎‎'s basic data types, like char, short, int, char *, etc. Serialization of more complex data is accomplished by breaking up the data into primitive units.

ضمنا یک مزیت و راحتی این کلاس اینه که عملیات کاملا مستقل از هر پلتفرمی انجام میشه.

پس اون چیزی که شما دنبالش هستید به اون صورت کلی بنظر میرسه در کیوت وجود نداره.
اما اگر بخواید فکر میکنم میتونید از امکانات کتابخانه های دیگر مخصوص اینکار در سی++ استفاده کنید.
کلا کیوت چنین چیزی نداره به اون صورتی که شما مد نظر دارید و در بعضی زبانها و فریمورک های دیگه هست (فکر میکنم در پایتون این امر استاندارد و خیلی سرراست هست). منظورم سریالایز کردن تمام یا بیشتر کلاسها هست.
اصلا سریالایز کردن درمورد خیلی اشیاء کیوت ظاهرا از بعضی جنبه های اساسی بی معنا یا مشکل ساز هست طبق متنی که جای دیگه ای خوندم، و ظاهرا به همین علت عمدا از امکان سریالایز شدن خیلی از اشیاء کیوت جلوگیری شده (با طراحی و تعیین سطوح دسترسی محدود کننده در متدهای مربوطهء اون کلاسها). بنابراین توصیه میکنم کاربرد مورد نظر خودتون رو از راه دیگری پیاده کنید. یعنی شیء رو در سمت دیگه خودتون در کد بسازید، منتها پارامترها و خصوصیات لازم اون رو اگر از انواع پایه ای باشن میتونید سریالایز کنید و بفرستید (با همین QDataStream میتونید اینکار رو بکنید). مثلا همون اعداد اعشاری رو که برای ساخت شیء مورد نظر از کلاس خودتون بهش پاس کردید و نیز انواع رشته ای و آرایهء بایتی رو بنظرم چه از نوع استاندارد سی++ و چه از انواع کیوت میتونید سریالایز کرده و ارسال کنید و طرف دیگه بازیابی کنید و البته همچنین اون تعداد محدود از کلاسهای کیوت رو.
پس به اون فرم کلی درمورد تمام کلاسها و بخصوص کلاسهای غیرکیوت امکان سریالایز کردن از طریق کیوت وجود نداره و ضمنا فکر میکنم که QVariant هم اصلا برای اینکار نیست.

این تاجایی که من تونستم کمکتون کنم.
برای کمک بیشتر میتونید به این آدرس مراجعه کنید: http://www.qtcentre.org/forum/

python_85
یک شنبه 27 تیر 1389, 23:22 عصر
مرسی
بله امروز که داشتم مستندات کیوتی رو می خوندم همین مطلبی که در موردQVariant گفته بودید رو دیدم
برا همین هم دارم یه کلاس شبیه همون چیزی که مثلا تو دات نت در مورد اکس ام ال سریالایز هست رو تو کیوت پیاده سازی می کنم

بازم ممنون از راهنمایتون