Bonjour a tous,
je dois developper une solution qui imite certains points de boost::serialization (car je ne peux utiliser boost dans mon projet).
Ce que je cherche a imiter, c'est le fait qu'une classe peut etre serialisée soit par une methode, soit par une 'free function'.
en googlant, j'ai trouvé ce post tres interessant qui m'a permis de jeter les bases d'une solution.
Toutefois, je rencontre un pb. J'ai ecrit la classe template "Serializer" (cf ci-dessous)
dont la méthode fait le travail (utilisation de la méthode 'serialise' de la classe de l'objet ou de la fonction 'serialize').
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 template <class OBJECT> class Serializer { public: typedef OBJECT ObjectType; Serializer(ObjectType *p_pObject) : m_pObject(p_pObject) { }; virtual ~Serializer() { }; std::string Serialize() { std::string l_str; if (m_pObject) { if (Utils::has_serialize_member<OBJECT,void (OBJECT::*)(std::string &, const unsigned int)>::value) m_pObject->serialize(l_str,0); else serialize(l_str,*m_pObject,0); } return l_str; }; private : ObjectType *m_pObject; };
C'est dans cette fonction que ca coince : Utils::has_serialize_member<OBJECT,void (OBJECT::*)(std::string &, const unsigned int)>::value vaut toujours 'faux' donc le compilo cherche une fonction serialize(std::string &, OBJECT &, const unsigned int) qu'il ne trouve pas ...
Ce qui est bizarre, c'est que si j'appelle Utils::has_serialize_member<TestObject,void (TestObject::*)(std::string &, const unsigned int)>::value
avec TestObject =
ca marche parfaitement.
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 class TestObject { public: TestObject () {m_Data=0.;}; virtual ~TestObject () {}; void serialize(std::string& ar, const unsigned int version) { std::stringstream l_SS; l_SS<<"TestObject ::serialize - Data = ["<<m_Data<<"]"; ar = l_SS.str(); }; //! public for testing double m_Data; };
On dirait que le compilo est perdu a cause du template "OBJECT".
Quelqu'un a-t-il deja rencontré ce pb ou a une idée sur le pb et sur une solution eventuelle ?
Merci
V
Partager