Serializácia a deserializácia C++

Sten

Re: Serializácia a deserializácia C++
« Odpověď #15 kdy: 01. 05. 2011, 22:20:28 »
Tukan: s tím, že to musí být stejně zásadně nesouhlasím, serializace a deserializace není inverzní operace. Serializací totiž objekt nezaniká, zatímco deserializací vzniká. Proto by to mělo být asymetrické (konstruktor versus metoda/operátor).

Je zbytečné dělat serializaci a deserializaci asymetricky, ony jsou totiž z hlediska toho objektu totožné. Takhle to třeba řeším já:
Kód: [Vybrat]
class Example
{
public:
    Example()
        : first(1)
        , second(2)
    {}


    template <class T>
    Example(Serialize::Construct /* Tag, který říká, že jde o deserializaci */, T &archive)
    {
        this->serialize(archive);
    }


    template <class T>
    void serialize(T &archive)
    {
        archive & this->first;
        archive & this->second;
        //...
    }


protected:
    std::size_t first;
    std::size_t second;
};


Re: Serializácia a deserializácia C++
« Odpověď #16 kdy: 02. 05. 2011, 00:29:12 »
Čau Stene.

K serializačním konstruktorům jsem se zatím ještě nedostal, spíš to řeším tak, že objekty jsou konstruované v základním (výchozím) tvaru. To nutně nemusí znamenat, že musí mít defaultní konstruktor. Ale myšlenkou je, že serializací se zaznamenává stav nějakých objektů a deserializací se ten stav obnovuje. Tedy nejprve se objekty zkonstruují ve výchozím stavu a pak se jim ten stav změní.

Proč jsi v původním mém konceptu změnil operator () na operator &?  On se operátor () dá použít i jako volání funktoru.

Re: Serializácia a deserializácia C++
« Odpověď #17 kdy: 02. 05. 2011, 00:32:14 »
Původního tazatele bych možná odkázal na mou teoretickou (bohužel nedokončenou) práci na téma Serializace v C++ ve formě seriálu:

http://bredy.novacisko.cz/?g=main&kat=59

Sten

Re: Serializácia a deserializácia C++
« Odpověď #18 kdy: 02. 05. 2011, 00:56:16 »
Čau Stene.

K serializačním konstruktorům jsem se zatím ještě nedostal, spíš to řeším tak, že objekty jsou konstruované v základním (výchozím) tvaru. To nutně nemusí znamenat, že musí mít defaultní konstruktor. Ale myšlenkou je, že serializací se zaznamenává stav nějakých objektů a deserializací se ten stav obnovuje. Tedy nejprve se objekty zkonstruují ve výchozím stavu a pak se jim ten stav změní.

Proč jsi v původním mém konceptu změnil operator () na operator &?  On se operátor () dá použít i jako volání funktoru.

Serializační konstruktor je celkem jednoduchý na napsání (je nutné dát pozor na věci, co se musí vyplnit už v konstruktoru, aby byly serializovány ve stejném pořadí, v jakém je konstruktor vytáhne) a hodí se do míst, kdy objekt nemůže mít defaultní konstruktor (třeba semafory sdílené podle jména nebo pokud objekt obsahuje konstantní položky). Dalo by se to řešit obalem přes pointer, ale když jsem z htmlcxx ukradl takové jednoduché řešení, jak značkovat použití obecné šablony, tak proč si to ztěžovat :-)

operator & jsem omylem použil tady, používá ho Boost.Serialization a občas s tím pracuju. Jinak taky používám operator (), hlavně kvůli tomu, že většinu serializací provádím do JSONu a tam často potřebuju mít dva parametry (klíč a hodnotu).

Re: Serializácia a deserializácia C++
« Odpověď #19 kdy: 02. 05. 2011, 08:38:20 »
Původního tazatele bych možná odkázal na mou teoretickou (bohužel nedokončenou) práci na téma Serializace v C++ ve formě seriálu:

http://bredy.novacisko.cz/?g=main&kat=59

Ďakujem, to vyzera celkom pekne napisane ;) určite so to prečitam:)


Re: Serializácia a deserializácia C++
« Odpověď #20 kdy: 02. 05. 2011, 10:02:42 »
Serializační konstruktor je celkem jednoduchý na napsání (je nutné dát pozor na věci, co se musí vyplnit už v konstruktoru, aby byly serializovány ve stejném pořadí, v jakém je konstruktor vytáhne) ...

Ano, a to je přesně o tom. Totiž, pokud chci využit deserializační konstruktor, musí i member proměnné (a to tedy všechny) používat deserializační konstruktory, musí být ve správném pořadí (a nejsem si jist, jestli pořadí inicializace je v normě C++ zaručeno), nebo v druhé variantě se ti to rozpadne na dvě části, což jsi ukázal v příkladu.
 - konstrukce ve výchozím stavu
 - deserializace, která stav změní.

Není to až tak velká výhoda, aby se vyplatilo zahazovat oboustrannost serializace ... "i zvenku" (z API ... vlastně máš tady dvě metody místo jedné, byť vnitřně se z druhé volá první)

D.A. Tiger

  • ****
  • 486
  • Tygr, který žere tučňáka ;-)
    • Zobrazit profil
    • E-mail
Re: Serializácia a deserializácia C++
« Odpověď #21 kdy: 02. 05. 2011, 20:28:32 »

K serializačním konstruktorům jsem se zatím ještě nedostal, spíš to řeším tak, že objekty jsou konstruované v základním (výchozím) tvaru. To nutně nemusí znamenat, že musí mít defaultní konstruktor. Ale myšlenkou je, že serializací se zaznamenává stav nějakých objektů a deserializací se ten stav obnovuje. Tedy nejprve se objekty zkonstruují ve výchozím stavu a pak se jim ten stav změní.

Serializaci má (podle mě) velice hezky vyřešenou fox toolkit. Nejen že používá serializační konstruktory, ale přetěžuje i operátory tříd datových proudů, takže stačí otevřít serializační soubor a pomocí operátorů << >> serializaci provést. Navíc samotná serializace konkrétních objektů se implemetuje přetížením metod load( ) a save( ) u všech potomků třídy FXObject, a mělo by být teoreticky možné využít k realizaci těchto metod místo přetížených operátorů streamů. Někomu se však může zdát jako nevýhoda, že celý tento mechanizmus je řešen pomocí klasických maker.     

Re: Serializácia a deserializácia C++
« Odpověď #22 kdy: 03. 05. 2011, 02:30:05 »
Serializaci má (podle mě) velice hezky vyřešenou fox toolkit. Nejen že používá serializační konstruktory, ale přetěžuje i operátory tříd datových proudů, takže stačí otevřít serializační soubor a pomocí operátorů << >> serializaci provést. Navíc samotná serializace konkrétních objektů se implemetuje přetížením metod load( ) a save( ) u všech potomků třídy FXObject, a mělo by být teoreticky možné využít k realizaci těchto metod místo přetížených operátorů streamů. Někomu se však může zdát jako nevýhoda, že celý tento mechanizmus je řešen pomocí klasických maker.   

No nevím, přečti si můj seriál, mou zvolená metoda má prostě opodstatnění. A není to žádný ad-hoc řešení. První verze serializátoru vznikla někdy v roce 2002 a byť se od toho posledního návrhu velice liší, ten vývoj byl celkem bouřlivý. Úspěšně jsem to nasadil například v některých částech fulltextu (v Seznamu), Lištička to používá pro serializaci zpráv mezi okny prohlížeče IE, později jsem napsal i vlastní RPC protokol, nebo serializaci do XML streamu.