C ++에서의 직렬화 구현

4.33 (8 표) |
|

모든 객체는 ‘상태’를 파일에 저장하고 프로세스가 시작될 때 읽는 방법을 알아야하므로 중단 된 부분부터 계속할 수 있습니다.
그러나 C ++의 직렬화 구현은 (C #과 달리) 사소한 것이 아니며 우리 모두가 의존하기를 원하지 않습니다
MFC 프레임 워크 또는 부스트 직렬화 (어떤 템플릿을 사용하여 거대한 실행 파일을 만들 수 있습니다!).
다음은 직렬화 구현에 대한 요점입니다.
1. 복제 가능한 객체에 대한 추상 클래스가 있어야합니다.
2. 클래스 이름을 가진 복제 가능한 객체를 만드는 팩토리 클래스가 있어야합니다.
(힌트 : 싱글 톤 구현 사용).
3. 템플릿을 전혀 사용할 필요가 없습니다!
4. C ++에 정적 생성자가 없기 때문에 클래스를 자동으로 factory에 등록하는 것은 쉽지 않습니다.
이 작업은 클래스에 정적 멤버를 추가하는 매크로로 수행 할 수 있습니다.
5. 객체를 어디에 저장했는지 모르기 때문에 추상 Archive 클래스가 있어야합니다.
(파일, 파이프, 메모리 ..).
6. auto_ptr을 사용하여 직렬화가 실패하거나 예외가 발생할 경우 오브젝트를 삭제하십시오.
다음은 직렬화를위한 간단하지만 완전한 구현 프레임 워크입니다 . 파일 설명 :
- Dynamics.h – 복제 가능한 컬렉션의 싱글 톤 구현.
- Persistent.h / .cpp – Dynamics.h를 사용하는 직렬화 구현.
Dynamics.h :
먼저 복제 가능한 모든 객체에 대한 기본 클래스를 선언합니다. 모든 복제 가능한 클래스는 ‘Clonable’에서 파생되고 createObj
메소드를 구현해야합니다 . createObj
클래스의 새 객체를 반환해야합니다.
class Clonable
{
public:
virtual ~Clonable() {}
virtual Clonable* createObj() const = 0;
};
복제 가능한 객체의 컬렉션을 선언해야합니다. 이름을 주면 모든 복제 가능한 클래스의 인스턴스를 만들 수 있어야합니다.
예 :
string className = "MyComplexClass";
Clonable* instance = Clonables::Instance().create(className);
MyComplexClass* pCmplx = dynamic_cast<MyComplexClass*>(instance);
아래는 Cloneable 컬렉션 클래스입니다. 싱글 톤 구현에 주목하십시오.

class Clonables {
private:
typedef map<string, const Clonable*> NameToClonable;
NameToClonable __clonables;
private:
Clonables() {}
Clonables(const Clonables&); // Prevent copy-construction
Clonables& operator=(const Clonables&); // Prevent assignment
~Clonables()
{
for(NameToClonable::const_iterator it = __clonables.begin(); it != __clonables.end(); it++){
const Clonable* clone = it->second;
delete clone;
}
__clonables.clear();
}
public:
static Clonables& Instance()
{
static Clonables instance; // Guaranteed to be destroyed.
return instance; // Instantiated on first use.
}
public:
void addClonable(const char* className, const Clonable* clone)
{
string name = className;
NameToClonable::const_iterator it = __clonables.find(name);
if(it == __clonables.end()) {
__clonables[name] = clone;
}
}
Clonable* create(const char *className)
{
string name = className;
NameToClonable::const_iterator it = __clonables.find(name);
if(it == __clonables.end()) return NULL;
const Clonable* clone = it->second;
return clone->createObj();
}
};
'<code>Clonables
복제 가능한 파생 클래스는 ‘(우리의 복제 가능한 컬렉션)에 등록 할 수 있도록 다음 클래스의 정적 멤버를 추가 할 수 있습니다 .
class AddClonable {
public:
AddClonable(const char* className, const Clonable* clone){
Clonables::Instance().addClonable(className, clone);
}
};
Persist.h :
우리는 우리의 끈질긴 사물이 어디에 저장 될지 확신하지 못합니다. 따라서 우리는 스트리밍을위한 기본 클래스 (저장 및로드 지원 포함)를 구현해야합니다. 아카이브는 파일이나 파이프 또는 객체를 저장하는 모든 것이 될 수 있습니다.
class Archive
{
private:
bool _isStoring;
public:
Archive(bool isStoring = true) : _isStoring(isStoring) {}
virtual ~Archive() {}
virtual void write(const void* buffer, size_t length) {}
virtual void read(void* buffer, size_t length) {}
Archive& operator<<(const string& str);
Archive& operator>>(string& str);
Archive& operator<<(int val);
Archive& operator>>(int& val);
bool isStoring() const { return _isStoring; }
void setDirection(bool isStoring) { _isStoring = isStoring; }
};
STL iostream을 사용하는 특정 ‘Archive’클래스를 정의합시다.
class ArchiveFile: public Archive
{
private:
iostream* _stream;
public:
ArchiveFile(iostream* stream) : _stream(stream) {}
virtual ~ArchiveFile() {}
virtual void write(const void *buffer, size_t length);
virtual void read (void* buffer, size_t length);
};
Persistent 클래스는 아래의 ‘Persistent’클래스에서 파생되고 ‘serialize’메소드를 구현합니다.
영속 객체는 또한 복제 가능 객체입니다.
class Persistent : public Clonable
{
public:
virtual ~Persistent() {}
static Persistent* load(Archive& stream);
void store(Archive& stream) const;
protected:
virtual void serialize(Archive& stream) {}
virtual int version() const { return 0; }
};
우리는이 방법의 자동 구현 createObj
과 자동 등록을 원합니다.
우리 클래스의 복제물 컬렉션에. 이것은 다음의 매크로 declerations와 함께 할 수 있습니다 :
PERSISTENT_DECL
매크로 createObj
는 우리를위한 ‘Clonable’클래스 의 메소드를 구현합니다 . 또한 AddClonable
클래스에 정적 멤버를 추가합니다 . 이렇게하면 우리의 영속 클래스가 복제 가능한 컬렉션에 자체 등록됩니다. 이것은 .h 클래스 정의에 추가되어야합니다 (아래 예 참조).
#define PERSISTENT_DECL(className) \
public: \
virtual Clonable* createObj() const \
{ \
return new className(); \
} \
private: \
static AddClonable _addClonable;
PERSISTENT_IMPL
이 정적 멤버를 초기화합니다. 이것은 .cpp 클래스 구현에 추가되어야합니다.
#define PERSISTENT_IMPL(className) \
AddClonable className::_addClonable(#className, new className());
사용법의 예 : Event.h는 'Event'
영속성이 있어야 하는 간단한 클래스를 정의합니다 .
class Event : public Persistent {
private:
int _id;
public:
Event() : _id(0) {}
virtual ~Event() {}
int getId() const { return _id; }
protected:
virtual void serialize(Archive& stream)
{
if(stream.isStoring())
stream << _id;
else
stream >> _id;
}
PERSISTENT_DECL(Event)
};
Event.cpp
#include "Event.h"
PERSISTENT_IMPL(Event)
우리는에 뛰어 전에 '<code>Archive'
및 '<code>Persistent'
클래스 구현, 여기에 동일한 내용을 가진 새로운 개체로 다시 읽어 후 바탕 화면에 바이너리 파일로 우리의 ‘이벤트’객체를 직렬화하는 방법의 예입니다.
void serialize_example()
{
auto_ptr<Event> event(new Event());
fstream file("C:\\Users\\Gilad\\Desktop\\try.data",
ios::out | ios::in | ios::binary | ios::trunc);
ArchiveFile stream(&file);
if(! file)
throw "Unable to open file for writing";
event->store(stream);
file.seekg(0, ios::beg);
Event* newEvent = dynamic_cast<Event*>(Persistent::load(stream));
event.reset(newEvent);
file.close();
}
<event>Persistent.cpp :
우리는 기본적인 ‘int’및 ‘string’아카이브를 사용하여 구현을 시작합니다.

Archive& Archive::operator<<(int val)
{
write(&val, sizeof(int));
return *this;
}
Archive& Archive::operator>>(int& val)
{
read(&val, sizeof(int));
return *this;
}
Archive& Archive::operator<<(const string& str)
{
int length = str.length();
*this << length;
write(str.c_str(), sizeof(char) * length);
return *this;
}
Archive& Archive::operator>>(string& str)
{
int length = -1;
*this >> length;
vector<char> mem(length + 1);
char* pChars = &mem[0];
read(pChars, sizeof(char) * length);
mem[length] = NULL;
str = pChars;
return *this;
}
이제 특정 STL iostream 보관 구현을 추가해 보겠습니다.
void ArchiveFile::write(const void* buffer, size_t length)
{
_stream->write((const char*)buffer,length);
if(! *_stream)
throw "ArchiveFile::write Error";
}
void ArchiveFile::read(void* buffer, size_t length)
{
_stream->read((char*)buffer, length);
if(! *_stream)
throw "ArchiveFile::read Error";
}
이것은 영구 객체를 아카이브에 저장 하는 방법입니다 .
- 개체의 클래스 이름을 저장하십시오.
- 클래스의 버전을 저장하십시오.
- 객체를 직렬화하도록 호출합니다.
void Persistent::store(Archive& stream) const
{
string className = typeid(*this).name();
className = className.substr(className.find(' ') + 1);
stream << className;
int ver = version();
stream << ver;
stream.setDirection(true);
const_cast<Persistent *>(this)->serialize(stream);
}
다음은 아카이브에서 객체를 로드 하는 방법입니다 .
- 아카이브에서 클래스 이름 읽기
- cloneable 컬렉션과 간단한 캐스트를 사용하여 객체를 만듭니다.
- 버전이 올바른지 확인하십시오.
- 우리의 객체가 스스로를 비 직렬화하게하십시오.
auto_ptr의 사용에주의하십시오. (serialize 메소드와 같이) 예외가 발생하면 우리의 영속 객체가 삭제 될 것입니다.

Persistent* Persistent::load(Archive& stream)
{
string className;
stream >> className;
Clonable* clone = Clonables::Instance().create(className.c_str());
if(clone == NULL)
throw "Persistent::load : Error creating object";
auto_ptr<Clonable> delitor(clone);
Persistent * obj = dynamic_cast<Persistent *>(clone);
if(obj == NULL) {
throw "Persistent::load : Error creating object";
}
int ver = -1;
stream >> ver;
if(ver != obj->version())
throw "Persistent::load : unmatched version number";
stream.setDirection(false);
obj->serialize(stream);
delitor.release();
return obj;
}
g she
g know
rsacwgxy g
http://j.mp/3drY6lE
www.eduhelpcentral.com
tinyurl.com
cbd oil that works 2020
Jamee Mega
buy online viagra australia
what is cbd
John Deere Diagnostic and Test Manuals
browse around these guys
security screens
security screens for home windows
cbd gu..ues for sale in california
John Deere Service Manuals
plus cbd oil capsules for sale
review charlotte's web cbd oil for dogs
cbd oil makes a dog sick
difference between cbd for humans and dogs
cbd healing benefits
medterra cbd gel capsules kids
website here
click this link now
Google
Imelda Musumeci
cair qq
cairqq
casino338
judi bola
situs judi bola terbesar
musafirdigital.com
dewajudiqq
mandiriqq
pokerpelangi
judi poker pulsa
Jong Lanphere
deposit poker pulsa
dingdongtogel
Edie Furfey
dingdong togel daftar
Vallie Posik
dingdong togel
dingdong togel
Ruthann Hengl
pulsa joker123
Nettie Dagner
togel wap
Hermelinda Shibles
dingdong casino
Myong Wilkens
dingdong 34d
Krishna Josich
66.42.58.199
PUBG Mobile 2020
Malik Wetherby
Sbobet777
Bet88 Online
bet88 online
Firmanrahman
totobet singapura
Judi online
totobet hongkong
produksi bubble wrap
link alternatif totobet
togel online
Kriteria Audit SMK3
bali car hire with driver
Konsultan SMK3
library pdf ebooks free
Nadene Besancon
resep pasta
Mario Mandry
kaldu bubuk
Roxann Fesenmyer
trang danh de online uy tin 188loto
soi cau mb hom nay 188loto
trang danh de online uy tin thethaobet danh lo de online uy tin thethaobet
trang lo de thethaobet
trang soi cau k8loto
danh de online uy tin k8loto
soi cau mien bac hom nay tai thethaobet
danh de online uy tin 188xoso
du doan xo so mien bac 188xoso
joker123 daftar
So Attwell
joker123 login
Mellisa Steil
joker123 download
Adell Morando
Situs Slot Pulsa Online
Daftar Judi Slot Online Terbaru
daftar poker88
aplikasi joker123
joker123 download
poker 88
idn poker asia 88
apk idn poker
download joker 123
poker88 asia
helpful resources
Kittie Cake
joker123 login
Situs Judi Poker Online
Dominoqq Online
Eden Buitron
cara menghilangkan kebiasaan coli
joker slot apk
Theresia Stonefield
apk joker123
Carla Prochaska
poker88 daftar
Davida Galmore
cara membuat blog
Sibyl Bernecker
Judi Slot
Jena Christodoulou
paragon poker
Dian Jana
mybestpoker
Maximina Sprosty
idn poker88 asia
Neda Chanez
poker 88
Randi Canaan
idn poker apk
Joellen Jolina
situs judi online
Ethelene Masoner
cara import barang china
Dorinda Segars
Artikel kesehatan
Isela Cawthorn
Mobil Bekas Jakarta
Sherika Winchell
rumus lightroom selebgram
Brinda Krainbucher
cara membuat blog di blogger
Goldie Winkles
jagad poker
cover lagu
Kayak Storage Ideas
dingdong togel
daftar dingdongtogel
dingdong casino
dingdong togel
dingdong togel daftar
agen bola
Katalog Harga Promo
http://173.199.178.4/
Izetta Fodness
kelasjudi
Jazmin Rauda
bwin bet365
Anne Kennemore
s128.apk
Beatris Ellermann
s12888
Lin Sytsma
situs terpercaya bwinbet365
Cortney Eflin
s128
Florine Ammons
sabung ayam s128
Annamarie Heilbrun
sabung ayam online
Reena Lumbreras
king s128
king s128
s12888
Shakita Stainback
sabung ayam s128
Verda Stauder
Poker Texas Indonesia
Agen Judi Bola
Poker Texas Indonesia
Agen Sbobet88 Online
Jaime Kines
sbobet777 Slot
Evelyn Filmer
sbobet88 bola
Juliet Eads
sabung ayam s128
Lorilee Mead
s128 net
situs bet88
Kimbra Vondra
jagos1288
Joanie Davie
Bet88 Mobile
Karissa Trautwein
sabung ayam s128
Florencia Pronto
s128h
In Sirrine
s1288
s128
Raguel Rissell
Judi Bandarqq
Situs Judi QiuQiu
Linn Lashua
Themeforia
good cheap face masks
Bandarq Terpercaya
Situs Judi Online
Judi Dominoqq
Clare Bonsall
Agen Domino qq
Hsiu Kiernan
Casino online
Situs Judi Casino
Terina Plagge
Continue
Prediksi Togel China
Mana Goldfeder
Agen Poker
Maranda Aymond
http://senangdominopkv.com/
Sean Maslowsky
sabung ayam s128
Franchesca Phanthauong
s1288
Gerda Schilder
http://69.16.212.126
Ruth Hwang
download s128
Vita Apostal
login s128
Dionne Hawthorn
s128.apk
Leanora Prestridge
best hosting
daftar sv388
slot deposit pulsa 10rb
login totobet
daftar totobet online
daftar totobet online
agen slot deposit pulsa
judi qq online terpercaya
ceriaqq
agen bola terpercaya
Aplikasi Pkv Games Terupdate
dominobet
poker online
situs dominoqq online
www.doktercash.com
88csnking
21naga
Mega Bandar
solusiponsel
rezgamer.com
https://webdewaqq.com/
Ulatmovie.com
https://dominobetqq.net/
asik dewa
qbesar
www.elevenconsignment.com
Dulcie Bompane
sosbobet
Jazmine Ciprian
Holli Capriccioso
http://www.kamera4d.org/
Delena Lovaas
Lang Letman
download free epub books online
Jeanice Bern
Pam Kail
Kursus Bahasa Inggris
Hellen Corrado
Renda Fodera
go
Margorie Klaassen
Caroline Stearne
rezgamer
Adriene Pingrey
Salena Hupper
togel online terbaru
Cathern Elewa
Diann Mcgiboney
link totobet
totobet sgp
Dierdre Wolfert
Dallas Fesperman
dindong togel
dingdong togel online
dingdong togel.wap
sabung ayam online
http://www.kamera4d.org/
s1288
s1281
indodewa99
daftar pokerace99
susupoker
resep masakanku
QQ77Bet
Lorean Levitan
Judi Bola Joinpoker.com
Agustina Larrimore
dingdong togel online
joker 888
Vanessa Myles
joker123.net
Hiedi Manns
vivoslot.net
joker388
Barb Tompkins
for beginners
Mercy Cerf
joker123.net
Marlo Santago
s1288
Serafina Lenhart
joker 128
Cythia Casson
joker188.net
slot Online
sbobet 88
idnplay poker
poker idn
pragmatic play
judi online
judionline.com
idn poker 88
fafafaslot
s128
joker123.net
Bess Eacret
jokerslot
Marisol Takeda
joker 123 slot
Ilene Broyles
joker 123
joker123 online
Melba Ana
joker123
Jaye Juniper
slot online joker123
Mirian Mihelcic
joker 123 slot
Donnette Test
joker123 slot
Marjory Downie
joker slot
Avelina Kjellman
slot joker123 online
Sherlene Hiett
joker123 slot
Louann Vest
BaliQQ
Voncile Perina
https://ebolafc.net/
Laurel Burghard
wongqq
Francene Larimore
khazanahpromosi
Billi Maccarone
Canon Printer
Dorine Zemel
best printer
Zenaida Fulkerson
Samsung Printer
Margurite Beresik
Mebel Jepara
Celestine Fanelli
kasinoid.com
Susana Hutto
halaman ini
Lemari Hias
Venetta Gregson
i thought about this
https://ponseloka.com
Selene Rindal
https://www.sallyponchak.com
Sumiko Mancini
Pokerpelangi1.link
Paz Montalvo
qbesar
Mai Dimmer
levidio.musafirdigital
Margarite Mcpheeters
https://thompson2009.com/
https://charlesforboston.com/
https://ardusat.org/
dominoqqmu.com
jokerwin 123
joker 888
agen joker123 terpercaya
sbobet mobile
joker 123 apk
jokerwin123 login
Patience Dorshimer
sbobet indonesia
Merrilee Bedillion
sbobet daftar
Shaunte Cazarez
daftar sbobet88 online
Carolynn Burcham
have a peek here
Tobie Burdg
Google
Susan Kennealy
Lamont Barbier
Dominique Scheuerman
http://107.152.32.187/
Samella Aaronson
https://hermes21.net/
Veola Acoba
http://103.194.171.205/
Jannet Rigoni
https://www.masterhoki.com
cheap flights australia
http://103.194.171.205/
https://hermes21.net/
http://107.152.32.187/
you could try this out
안전사이트
site here
Jadiel Rivas
Google
Tu Sage
https://165.22.245.200
tugas mahasiswa
https://157.245.145.0
Franchesca Heald
tugas mahasiswa
Jackelyn Crooms
https://mpocasino.com
Bobby Ruscher
SSH SSL
Trik internet gratis
judi online
situs judi qq
Pkv Games Online
agen poker online
agen sabung ayam online
s1288 sabung ayam
deposit s128
Exie Stutheit
agen sabung ayam online
Alesia Marcelli
daftar s1288 sabung ayam
s1288 sabung ayam
Chia Haspel
daftar s128
Liza Sirrine
joker123 daftar
Aufaproject46
download joker123 apk
Karl Bisio
dadu online terpercaya
wshh mobile
Stefany Groys
apk editor pro apk
Cheyenne Sahota
houses for rent near me private owner
Kimi Tonschock
houses to rent by private landlords
homes for rent by owners near me
media islam terpercaya
waheedbaly
nguliah.com
http://66.42.50.255/
sistem pemerintahan presidensial dan parlementer
http://45.76.157.60/
www.qqgalaxyus.com
http://202.182.119.182/
java388
ufabet169.com
Minna Wildey
idn poker
Anthony Center
Pulautidungdino.com
Liliana Pawlak
https://www.oregonwave.org/
Tamela Beneke
Pulauparidino.com
Vallie Beech
judi online terpercaya
Joellen Lauster
judi online terpercaya
Antonette Stemm
judi online terpercaya
Lacy Sannella
situs poker online
Regina Fernadez
daftar harga agen pulsa termurah
flash xiaomi
Liz Viste
daftar agen pulsa murah
Devon Greynolds
service iphone malang
Tisa Angelone
Cek nomer smartfren
Terrie Granby
PULSA PAYPAL OTOMATIS
Charisse Capan
jual webbing sling
Hallie Lukaszewicz
Hattie Kirkling
Kristan Rothschild
chain hoist
Avery Landen
harga webbing sling
Maya Sonnenberg
daftar agen pulsa
Dolores Tegtmeier
daftar harga agen pulsa termurah
flat illustration design
judi online terpercaya
Sylvia Brenek
poker online
situs dominoqq
bandarq
situs judi online
istanaqq
Mozelle Charm
poker online
Kazuko Bodon
situs bandarqq
Nenita Mulgrew
idn live terpercaya
Emelia Michno
situs pkv games
James Paruta
dominoqq
Rosalina Bual
situs judi online
Lizeth Kachiroubas
link slot deposit pulsa
Leandra Pinedo
judi online
Jenell Klepfer
Situs Slot Online
Donita Catenaccio
situs judi online
Shauna Fredley
langitqq
qbesar
langitqq
paten99.cc
qkecil
qbesar
dining near me
qkecil
qbesar
microgaming slot
poker pulsa
judi pulsa
agen judi pulsa online
joker slot
joker123
judi slot online
Info Keluarga Sehat
slot joker123
sv388
sv388 apk
situs judi bola terpercaya
pinjaman online bri
Karmen Oines
s128 daftar
Albert Kufeldt
sv388 login
Kris Menches
cara download sv388
s128 online
sv388
s128 online
s128 daftar
download s128 apk
situs s128
s1288
joker slot 123
download aplikasi s128
Situs Judi Bandarqq
situs bola
Bandarqq
Judi Bandarqq
umimarfa
situs judi online 24jam terpercaya
harga suzuki ertiga
slot joker123
login idn poker
netflix gratisan
login sbobet 88
daftar sbobet88
agen sabung ayam terpercaya
sbobet indonesia
sbobet
sabung ayam online
sbobet88 bola
login sv388
situs slot online
slotonline
daftar slot online terbaru
poker online
idnplay poker
idn poker online
poker idn play
agen slot online
daftar game slot online
idnpoker login
arespedia.com
white charcoal
klik disini
Bukumasakan.com
idn poker login idnplay
biaya balik nama mobil
Jenell Bellitti
signal forex
rentalmobil.info
Kizzy Ceraos
http://195.154.113.104
Teresita Jasionowski
Situs Judi Bola Online
Catina Philley
annalo.org
Farrah Frascella
Login terimaqq
Nicole Roley
klik disini
Pennie Delfuente
Maxbet Falmouthheritagewalks
Camila Belka
Login terimaqq
Selma Lehoux
Judi Bola online terpercaya
Sonya Gabardi
alternatif terimaqq
Courtney Petruzzi
situs togel online
bigosport
togel hongkong
agen dominoqq terpercaya
domino poker online