Si quelqu un peut me dire si on peut faire ca avec la boost et comment:

On a 4 objets :
- ObjA
- ObjB
- ObjC
- ObjAC
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
 
//__________________________________________________________
//
//                             OBJ A
//__________________________________________________________
 
class ObjA
{
public:
	ObjA(void);
	ObjA(ObjB& objB);
	~ObjA(void);
	string name;
	int id;
 
	ObjB* myObjBInA;
 
	friend class boost::serialization::access;
	template<class Archive>
             void serialize(Archive & ar, const unsigned int /* file_version */)
	{
		using boost::serialization::make_nvp;
		ar & make_nvp("nameObjA",name);
		ar & make_nvp("IdObjA",id);
		ar & make_nvp("ObjBInA",myObjBInA);
 
    }
};
//__________________________________________________________
//
//                             OBJ B
//__________________________________________________________
 
class ObjB
{
public:
	ObjB(void);
	~ObjB(void);
 
	string name;
	int id;
 
	friend class boost::serialization::access;
	template<class Archive>
             void serialize(Archive & ar, const unsigned int /* file_version */)
	{
		using boost::serialization::make_nvp;
		ar & make_nvp("nameObjB",name);
		ar & make_nvp("IdObjB",id);
    }
};
//__________________________________________________________
//
//                             OBJ C
//__________________________________________________________
 
class ObjC
{
public:
	ObjC(void);
	~ObjC(void);
 
	string name;
	int id;
 
	ObjB* ptrObjBInA;
 
	void write(ostream& out) const ;
	void read(istream& in);
 
	friend class boost::serialization::access;
	template<class Archive>
             void serialize(Archive & ar, const unsigned int /* file_version */)
	{
		using boost::serialization::make_nvp;
		ar & make_nvp("nameObjC",name);
		ar & make_nvp("IdObjC",id);
		ar & make_nvp("ptrObjBInA",ptrObjBInA);
 
    }
};
//__________________________________________________________
//
//                             OBJ AC
//__________________________________________________________
 
class ObjAC
{
public:
	ObjAC(void);
	~ObjAC(void);
 
	ObjA* myObjA;
	ObjC* myObjC;
 
	void ObjAC::write(ostream& out) const ;
	void ObjAC::read(istream& in) ;
 
	friend class boost::serialization::access;
	template<class Archive>
             void serialize(Archive & ar, const unsigned int /* file_version */)
	{
		using boost::serialization::make_nvp;
		ar & make_nvp("ObjA",myObjA);
		ar & make_nvp("ObjC",myObjC);
    }
 
};
 
//____________________________________________________
//
//				BOOST XML
//____________________________________________________
void ObjAll::write(ostream& out) const 
{ 
	cout<<"WRITE XML OBJALL WITH BOOST "<<endl;
	boost::archive::xml_oarchive oa(out);
	using boost::serialization::make_nvp;
	oa <<BOOST_SERIALIZATION_NVP(myObjA);
	oa <<BOOST_SERIALIZATION_NVP(myObjC);
}
void ObjAll::read(istream& in) 
{ 
	cout<<"READ XML OBJALL  WITH BOOST "<<endl;
	boost::archive::xml_iarchive ia(in);
	using boost::serialization::make_nvp;
	ia >>BOOST_SERIALIZATION_NVP(myObjA);
	ia >>BOOST_SERIALIZATION_NVP(myObjC);
}


Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
 
 
ObjA objA;
objA.name = "ObjAName";
objA.id = 0;
 
ObjB objB;
objB.name = "ObjBName";
objB.id = 1;
 
ObjC objC;
objC.name = "ObjCName";
objC.id = 2;
 
ObjAC objAC;
 
 
objA.myObjBInA = &objB;
objC.ptrObjBInA = &objB;
 
 
objAC.myObjA = &objA;
objAC.myObjC = &objC;
 
std::string filename = "D:\\TEST\\BoostSerializationTest.xml";
std::ofstream ofs(filename.c_str());
 
objAC.write(ofs);
Le cas a traiter ,on a :

ObjAC:
-ObjA* ------------> OBJA : ObjB*

-ObjC*--------------> ObjC : ObjB*

Avec les 2 classes ObjA et ObjC qui pointent sur le meme objet B.
Comment serialiser l'objet AC, en serialisant qu un seul fois l´objet B ?

Il doit avoir un moyen de dire a boost que j ai 2 references sur un meme objet (ObjB) et donc de serialiser qu une seul fois l objet B.

J ai tester de seraliser une liste de pointeur d objet, en mettant dans le liste 2 fois la meme adresse et ca fonctionne bien. Boost serialise qu une seule fois l objet pointe, et cree 2 pointeurs sur cet obj. Mais c est le meme contener.
(cf object_id="_UnNombre")