<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[BOOST_SERIALIZATION_NVP - generischere Loesung?]]></title><description><![CDATA[<p>Hallo @all,</p>
<p>ich spiele gerade ein bisschen mit boost serialization. Recht beeindruckend wie schoen einfach und durchdacht alles funktioniert, ABER es scheint das man sich im code vorher entscheiden muss ob man XML oder stream serialisieren will. Ich vermute mal der Hintergrund ist weil man die Symetrie zwischen Serialisierung/Deserialisierung erhalten will, sprich etwas was ich als stream Serialisiert habe kann ich ja nicht als XML Deserialisieren. Demzufolge hat ja boost die speziellen mechanismen fuer XML:</p>
<p>boost::serialization::make_nvp<br />
BOOST_SERIALIZATION_NVP</p>
<p>dieser Anatz fuehrt aber dazu das man fuer XML und stream Serialisierung verschiedene code braucht:</p>
<pre><code>template&lt;class Archive&gt;
void serializeXML(Archive &amp; ar, const unsigned int version)
{
  ar &amp; BOOST_SERIALIZATION_NVP( m_iJobID );
}

template&lt;class Archive&gt;
void serializeStream(Archive &amp; ar, const unsigned int version)
{
  ar &amp; m_iJobID;
}
</code></pre>
<p>mein naiver ansatz waere einfach eine Spezialialisierung:</p>
<pre><code>template&lt;typename TSerializer&gt;
struct SerializeWrapper
{
	template&lt;typename TValue&gt;
	static TValue&amp; wrap( const char*, TValue&amp; value_r ){ return value_r; }
};

template&lt;&gt;
struct SerializeWrapper&lt;boost::archive::xml_oarchive&gt;
{
	template&lt;typename TValue&gt;
	static const boost::serialization::nvp&lt;TValue&gt; wrap( const char*pStrName_r, TValue&amp; value_r ){ return boost::serialization::make_nvp(pStrName_r, value_r); }
};

#define BUILD_SERIALIZE_PARAM(param, archive) SerializeWrapper&lt;archive&gt;::wrap( BOOST_PP_STRINGIZE(param), param )
</code></pre>
<p>was obigen code fuer XML und Stream zu</p>
<pre><code>template&lt;class Archive&gt;
void serialize(Archive &amp; ar, const unsigned int version)
{
		ar &amp; BUILD_SERIALIZE_PARAM( m_JobState, Archive );
}
</code></pre>
<p>vereinheitlicht. Sicher geht das schoener und es wundert mich das es dafuer nichts in der boost library zu geben scheint...</p>
<p>Danke und Viele Gruesse,<br />
Tobias</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/321873/boost_serialization_nvp-generischere-loesung</link><generator>RSS for Node</generator><lastBuildDate>Sat, 18 Jul 2026 16:38:16 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/321873.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 27 Nov 2013 11:53:46 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to BOOST_SERIALIZATION_NVP - generischere Loesung? on Wed, 27 Nov 2013 13:47:16 GMT]]></title><description><![CDATA[<p>Hallo @all,</p>
<p>ich spiele gerade ein bisschen mit boost serialization. Recht beeindruckend wie schoen einfach und durchdacht alles funktioniert, ABER es scheint das man sich im code vorher entscheiden muss ob man XML oder stream serialisieren will. Ich vermute mal der Hintergrund ist weil man die Symetrie zwischen Serialisierung/Deserialisierung erhalten will, sprich etwas was ich als stream Serialisiert habe kann ich ja nicht als XML Deserialisieren. Demzufolge hat ja boost die speziellen mechanismen fuer XML:</p>
<p>boost::serialization::make_nvp<br />
BOOST_SERIALIZATION_NVP</p>
<p>dieser Anatz fuehrt aber dazu das man fuer XML und stream Serialisierung verschiedene code braucht:</p>
<pre><code>template&lt;class Archive&gt;
void serializeXML(Archive &amp; ar, const unsigned int version)
{
  ar &amp; BOOST_SERIALIZATION_NVP( m_iJobID );
}

template&lt;class Archive&gt;
void serializeStream(Archive &amp; ar, const unsigned int version)
{
  ar &amp; m_iJobID;
}
</code></pre>
<p>mein naiver ansatz waere einfach eine Spezialialisierung:</p>
<pre><code>template&lt;typename TSerializer&gt;
struct SerializeWrapper
{
	template&lt;typename TValue&gt;
	static TValue&amp; wrap( const char*, TValue&amp; value_r ){ return value_r; }
};

template&lt;&gt;
struct SerializeWrapper&lt;boost::archive::xml_oarchive&gt;
{
	template&lt;typename TValue&gt;
	static const boost::serialization::nvp&lt;TValue&gt; wrap( const char*pStrName_r, TValue&amp; value_r ){ return boost::serialization::make_nvp(pStrName_r, value_r); }
};

#define BUILD_SERIALIZE_PARAM(param, archive) SerializeWrapper&lt;archive&gt;::wrap( BOOST_PP_STRINGIZE(param), param )
</code></pre>
<p>was obigen code fuer XML und Stream zu</p>
<pre><code>template&lt;class Archive&gt;
void serialize(Archive &amp; ar, const unsigned int version)
{
		ar &amp; BUILD_SERIALIZE_PARAM( m_JobState, Archive );
}
</code></pre>
<p>vereinheitlicht. Sicher geht das schoener und es wundert mich das es dafuer nichts in der boost library zu geben scheint...</p>
<p>Danke und Viele Gruesse,<br />
Tobias</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2368316</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2368316</guid><dc:creator><![CDATA[TheBigW]]></dc:creator><pubDate>Wed, 27 Nov 2013 13:47:16 GMT</pubDate></item><item><title><![CDATA[Reply to BOOST_SERIALIZATION_NVP - generischere Loesung? on Wed, 27 Nov 2013 12:02:04 GMT]]></title><description><![CDATA[<blockquote>
<p>dieser Anatz fuehrt aber dazu das man fuer XML und stream Serialisierung verschiedene code braucht:</p>
</blockquote>
<p>... und das Problem ist welches genau?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2368321</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2368321</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Wed, 27 Nov 2013 12:02:04 GMT</pubDate></item><item><title><![CDATA[Reply to BOOST_SERIALIZATION_NVP - generischere Loesung? on Wed, 27 Nov 2013 12:18:11 GMT]]></title><description><![CDATA[<p>Problem ist, dass ich dann fuer jede serialisierbare Klasse den serialize code 2 mal haben muss und ihn auch konsistent halten sollte. Ist ein bisschen wie copy/paste um zweimal das Gleiche zu machen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2368328</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2368328</guid><dc:creator><![CDATA[TheBigW]]></dc:creator><pubDate>Wed, 27 Nov 2013 12:18:11 GMT</pubDate></item><item><title><![CDATA[Reply to BOOST_SERIALIZATION_NVP - generischere Loesung? on Thu, 28 Nov 2013 13:37:41 GMT]]></title><description><![CDATA[<p>ok, ein bisschen schoener geht es:</p>
<pre><code>namespace SerializeWrapper
{
	template&lt;typename TSerializer, typename TValue&gt;
	void wrappedSerialize( const char*, TSerializer&amp; ar, TValue&amp; value_r )
	{ 
		ar &lt;&lt; value_r;
	}

	template&lt;typename TValue&gt;
	void wrappedSerialize( const char*pStrName_r, boost::archive::xml_oarchive&amp; ar, TValue&amp; value_r )
	{
		ar &amp; boost::serialization::make_nvp(pStrName_r, value_r);
	}
}

#define SERIALIZE_PARAM(param, archive) SerializeWrapper::wrappedSerialize( BOOST_PP_STRINGIZE(param), archive, param )
</code></pre>
<p>womit die Serialisierung immer zu:</p>
<blockquote>
<p>SERIALIZE_PARAM( job, arOut );</p>
</blockquote>
<p>wird. Leider klebt man immer an Macros wenn man den XML node name automatisch aus dem Variablennamen generieren will.<br />
Zumindest ist man so weitestgehend archiv-typ unabhaengig (text, oder XML)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2368615</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2368615</guid><dc:creator><![CDATA[TheBigW]]></dc:creator><pubDate>Thu, 28 Nov 2013 13:37:41 GMT</pubDate></item></channel></rss>