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)
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;
};
dont la méthode fait le travail (utilisation de la méthode 'serialise' de la classe de l'objet ou de la fonction 'serialize').

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 =
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;
	};
ca marche parfaitement.

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