Serializacia a deserializácia objektu – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Serializacia a deserializácia objektu – C / C++ – Fórum – Programujte.comSerializacia a deserializácia objektu – C / C++ – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Xgamer0
Duch
30. 4. 2011   #1
-
0
-

Zdravím, mam ulohu do školy na c++, v ktorom mam spravit serializáciu a deserializáciu objektu. Kedže som to nejako nevedel spraviť v tom mojom projekte tak som si vymyslel niečo jednoduchšie aby som to pochopil ale aj tak som nepochodil:)

Tu je kod:



#include <iostream>
#include <fstream>

using namespace std;

class Car
{
public:
Car(){};
Car(int w, int s, int p)
{
this->Weight = w;
this->MaxSpeed = s;
this->Price = p;
}
void setWeight(int w){ this->Weight = w;}
void setMaxSpeed(int s) {this->MaxSpeed = s;}
void setPrice(int p){this->Price = p;}

inline int getWeight() const {return Weight;}
inline int getMaxSpeed() const {return MaxSpeed;}
inline int getPrice() const {return Price;}

friend ostream& operator<<(ostream &os,Car &c);
private:
int Weight;
int MaxSpeed;
int Price;
};

ostream& operator<<(ostream &os,Car &c)
{
return(os << c.Weight << " " << c.MaxSpeed << " " << c.Price << endl);
}

class CarTrain
{
public:
CarTrain(){};
CarTrain(int s){this->size = s;this->carstore = new Car[size];}
void loadCar(int i,Car c){this->carstore[i] = c;}
Car getCar(int i){return this->carstore[i];}
int getSize(){return this->size;}
friend ostream& operator<<(ostream &os,Car &c);
void serialize(ostream& os)
{
Car tmp;
for(int i=0; i <this->size; i++)
{
tmp = this->carstore[i];
os << tmp;
}
}
CarTrain unserialize(ifstream& in)
{
CarTrain tmp; Car c;
int w,s,p;
tmp.size = this->size;
for(int i=0; i< this->size;i++)
{
in>>w;
in>>s;
in>>p;

c.setWeight(w);
c.setMaxSpeed(s);
c.setPrice(p);
tmp.loadCar(i,c);
}
return tmp;
}
private:
Car *carstore;
int size;
};

ostream& operator<<(ostream &os,CarTrain &ct)
{
Car tmp;
for(int i=0; i < ct.getSize(); i++)
{
tmp = ct.getCar(i);
os << tmp;
}
return os;
}

int main()
{
cout << "Serializacia a deserializacia" << endl;

Car c1(1000,150,8000);
Car c2(1200,190,9000);
Car c3(1400,220,120000);

CarTrain ct(10);
ct.loadCar(0,c1);
ct.loadCar(1,c2);
ct.loadCar(2,c3);

cout<<ct<<endl;
char *p = "ser.txt";
ofstream o;
o.open(p,ios::out);
ct.serialize(o);
o.close();

ifstream in;
in.open(p,ios::in);
CarTrain ct2 = ct.unserialize(in);
in.close();


return 0;
}



Problem je to že takto tá deserializácia nefunguje. Možno to bude aj tým že som asi uplne nepochopil pointu toho. A hlavne mam vyriešiť aj verzovanie objektov ale to nejako už vobec neviem:) Zatial som skušal textovu serializáciu. Poprosil by som niekoho kto sa tomu rozumie aby mi to trochu objasnil, resp. čo robim zle ..:) Ďakujem

Nahlásit jako SPAM
IP: 195.178.88.–
Reklama
Reklama
nervak0
Věrný člen
1. 5. 2011   #2
-
0
-

V unserialize nealokuješ carstore.

To serialize/unserialize vyhoď a udělej operator<</>> pro Car i CarTrain.
V CarTrain ukládej i size a podle toho pak načítej počet Car.
A inicializuj hodnoty i v defaultních konstruktorech.

Pro verzování prostě na začátku ukládej číslo verze. Teď jedničku, když pak třeba do Car přidáš Age, tak dvojku, atd. s každou změnou formátu ukládaných dat. Při načítání pak podle té verze poznáš, co načíst.

Nahlásit jako SPAM
IP: 213.211.51.–
Xgamer0
Duch
1. 5. 2011   #3
-
0
-

To nervak :

Ďakujem :) Som si nevšimol že tam nealokujem tu pamäť. Už mi to funguje ale dám na vaše rady a prerobím to tak :)

Nahlásit jako SPAM
IP: 195.178.88.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 100 hostů

Podobná vlákna

Deserializacia — založil Miro1701

Serializacia — založil PaLaDiN

Metody objektu — založil vdolek

Zavření objektu — založil Noneus

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý