<?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 Serialisierung: shared_ptr]]></title><description><![CDATA[<p>Hi allerseits</p>
<p>Momentan versuche ich einige meiner Klassen über shared_ptr und Boost Serialization zu serialisieren. Unglücklicherweise erhalte ich beim Deserialisieren folgenden Laufzeitfehler:</p>
<pre><code>../basic_iarchive.cpp:390: const
boost::archive::detail::basic_pointer_iserializer*
boost::archive::detail::basic_iarchive_impl::load_pointer(boost::archive::detail::basic_iarchive&amp;, void*&amp;, const
boost::archive::detail::basic_pointer_iserializer*, const
boost::archive::detail::basic_pointer_iserializer*(*)(const
boost::serialization::extended_type_info&amp;)): Assertion `new_cid == cid' failed.
Aborted
</code></pre>
<p>Bei genauerem Hinsehen ist mir aufgefallen, dass ich vergessen habe, &lt;boost/serialization/shared_ptr.hpp&gt; zu inkludieren und war daher auch überrascht, dass das Programm trotzdem problemlos kompilierte. Weniger überraschend war dann, dass auch das anschliessende Inkludieren keine Verbesserung brachte. Besonders der Programmgrösse nach zu urteilen, welche exakt dieselbe blieb, werden die Funktionen in diesem Header scheinbar trotzdem überhaupt nicht verwendet.</p>
<p>Meine erste Sorge ist also: Ist das die korrekte Art, einen shared_ptr zu serialisieren:</p>
<pre><code class="language-cpp">typedef boost::shared_ptr&lt;ProtocolFactory&gt; ProtocolFactoryPtr; 
// ... 
vector&lt;ProtocolFactoryPtr&gt; factories = list_of(ProtocolFactoryPtr(new Iec1107OverSerialFactory())); 
ProtocolFactoryPtr iec1107(new MeteringProtocolCompositeFactory(factories)); 
ofstream ofs(&quot;testIt.xml&quot;); 
archive::xml_oarchive oxml(ofs); 
oxml &lt;&lt; serialization::make_nvp(&quot;supportedProtocols&quot;, iec1107); 
// ... 
ProtocolFactoryPtr newProtocolFactory; 
ifstream ifs(&quot;testIt.xml&quot;); 
archive::xml_iarchive ixml(ifs); 
ixml &gt;&gt; serialization::make_nvp(&quot;supportedProtocols&quot;, newProtocolFactory);
</code></pre>
<p>Dabei ist zu beachten, dass ProtocolFactory eine abstrakte Basisklasse von Iec1107OverSerialFactory und MeteringProtocolCompositeFactory ist, wobei MeteringProtocolCompositeFactory selbst einen shared_ptr-Vektor (vector&lt;ProtocolFactoryPtr&gt;) enthält. Die drei relevanten Klassen werden wie folgt serialisiert:</p>
<p>ProtocolFactory:</p>
<pre><code class="language-cpp">template&lt;class archive&gt; void serialize(archive &amp;, const unsigned int) 
{ 
}
</code></pre>
<p>Iec1107OverSerialFactory:</p>
<pre><code class="language-cpp">#include &lt;boost/serialization/base_object.hpp&gt; 
#include &lt;boost/serialization/export.hpp&gt; 
#include &lt;boost/serialization/nvp.hpp&gt; 

BOOST_CLASS_EXPORT(Iec1107OverSerialFactory)  // Boost must include Serialization info for this class even if its not directly referencd (e.g. by its base class) 

template&lt;class Archive&gt; void Iec1107OverSerialFactory::serialize(Archive &amp;ar, const unsigned int version) { 
        using boost::serialization::make_nvp; 
        ar &amp; make_nvp(&quot;ProtocolFactory&quot;, boost::serialization::base_object&lt;ProtocolFactory&gt;(*this)); 
}
</code></pre>
<p>MeteringProtocolCompositeFactory:</p>
<pre><code class="language-cpp">#include &lt;boost/serialization/base_object.hpp&gt; 
#include &lt;boost/serialization/export.hpp&gt; 
#include &lt;boost/serialization/vector.hpp&gt; 
#include &lt;boost/serialization/nvp.hpp&gt; 

BOOST_CLASS_EXPORT(MeteringProtocolCompositeFactory)  // Boost must include Serialization info for this class even if its not directly referencd (e.g. by its base class) 

namespace boost { 
namespace serialization { 
template&lt;class Archive&gt; inline void save_construct_data(Archive &amp;ar, const MeteringProtocolCompositeFactory *pf, const unsigned int version) { 
        using boost::serialization::make_nvp; 
        ar &amp; make_nvp(&quot;IncludedProtocols&quot;, pf-&gt;getFactories()); 
} 
template&lt;class Archive&gt; inline void load_construct_data(Archive &amp;ar, MeteringProtocolCompositeFactory *pf, const unsigned int version) { 
        using boost::serialization::make_nvp; 
        std::vector&lt;ProtocolFactoryPtr&gt; factories; 
        ar &amp; make_nvp(&quot;IncludedProtocols&quot;, factories); 

        ::new(pf)MeteringProtocolCompositeFactory(factories); 
} 
} 
} 
template&lt;class Archive&gt; void MeteringProtocolCompositeFactory::serialize(Archive &amp;ar, const unsigned int version) { 
        using boost::serialization::make_nvp; 
        ar &amp; make_nvp(&quot;ProtocolFactory&quot;, boost::serialization::base_object&lt;ProtocolFactory&gt;(*this)); 
}
</code></pre>
<p>Zweitens frage ich mich auch, weshalb &lt;boost/serialization/shared_ptr.hpp&gt; scheinbar gar nicht benötigt / verwendet wird beim Ausführen von &quot;oxml &lt;&lt; serialization::make_nvp(&quot;supportedProtocols&quot;, iec1107);&quot; oder &quot;ixml &gt;&gt; serialization::make_nvp(&quot;supportedProtocols&quot;, newProtocolFactory);&quot; ...?</p>
<p>Besten Dank in jedem Fall für eure Antworten und greeetz<br />
Kessi</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/201252/boost-serialisierung-shared_ptr</link><generator>RSS for Node</generator><lastBuildDate>Mon, 05 Oct 2026 18:37:42 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/201252.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 27 Dec 2007 02:03:36 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Boost Serialisierung: shared_ptr on Thu, 27 Dec 2007 02:03:36 GMT]]></title><description><![CDATA[<p>Hi allerseits</p>
<p>Momentan versuche ich einige meiner Klassen über shared_ptr und Boost Serialization zu serialisieren. Unglücklicherweise erhalte ich beim Deserialisieren folgenden Laufzeitfehler:</p>
<pre><code>../basic_iarchive.cpp:390: const
boost::archive::detail::basic_pointer_iserializer*
boost::archive::detail::basic_iarchive_impl::load_pointer(boost::archive::detail::basic_iarchive&amp;, void*&amp;, const
boost::archive::detail::basic_pointer_iserializer*, const
boost::archive::detail::basic_pointer_iserializer*(*)(const
boost::serialization::extended_type_info&amp;)): Assertion `new_cid == cid' failed.
Aborted
</code></pre>
<p>Bei genauerem Hinsehen ist mir aufgefallen, dass ich vergessen habe, &lt;boost/serialization/shared_ptr.hpp&gt; zu inkludieren und war daher auch überrascht, dass das Programm trotzdem problemlos kompilierte. Weniger überraschend war dann, dass auch das anschliessende Inkludieren keine Verbesserung brachte. Besonders der Programmgrösse nach zu urteilen, welche exakt dieselbe blieb, werden die Funktionen in diesem Header scheinbar trotzdem überhaupt nicht verwendet.</p>
<p>Meine erste Sorge ist also: Ist das die korrekte Art, einen shared_ptr zu serialisieren:</p>
<pre><code class="language-cpp">typedef boost::shared_ptr&lt;ProtocolFactory&gt; ProtocolFactoryPtr; 
// ... 
vector&lt;ProtocolFactoryPtr&gt; factories = list_of(ProtocolFactoryPtr(new Iec1107OverSerialFactory())); 
ProtocolFactoryPtr iec1107(new MeteringProtocolCompositeFactory(factories)); 
ofstream ofs(&quot;testIt.xml&quot;); 
archive::xml_oarchive oxml(ofs); 
oxml &lt;&lt; serialization::make_nvp(&quot;supportedProtocols&quot;, iec1107); 
// ... 
ProtocolFactoryPtr newProtocolFactory; 
ifstream ifs(&quot;testIt.xml&quot;); 
archive::xml_iarchive ixml(ifs); 
ixml &gt;&gt; serialization::make_nvp(&quot;supportedProtocols&quot;, newProtocolFactory);
</code></pre>
<p>Dabei ist zu beachten, dass ProtocolFactory eine abstrakte Basisklasse von Iec1107OverSerialFactory und MeteringProtocolCompositeFactory ist, wobei MeteringProtocolCompositeFactory selbst einen shared_ptr-Vektor (vector&lt;ProtocolFactoryPtr&gt;) enthält. Die drei relevanten Klassen werden wie folgt serialisiert:</p>
<p>ProtocolFactory:</p>
<pre><code class="language-cpp">template&lt;class archive&gt; void serialize(archive &amp;, const unsigned int) 
{ 
}
</code></pre>
<p>Iec1107OverSerialFactory:</p>
<pre><code class="language-cpp">#include &lt;boost/serialization/base_object.hpp&gt; 
#include &lt;boost/serialization/export.hpp&gt; 
#include &lt;boost/serialization/nvp.hpp&gt; 

BOOST_CLASS_EXPORT(Iec1107OverSerialFactory)  // Boost must include Serialization info for this class even if its not directly referencd (e.g. by its base class) 

template&lt;class Archive&gt; void Iec1107OverSerialFactory::serialize(Archive &amp;ar, const unsigned int version) { 
        using boost::serialization::make_nvp; 
        ar &amp; make_nvp(&quot;ProtocolFactory&quot;, boost::serialization::base_object&lt;ProtocolFactory&gt;(*this)); 
}
</code></pre>
<p>MeteringProtocolCompositeFactory:</p>
<pre><code class="language-cpp">#include &lt;boost/serialization/base_object.hpp&gt; 
#include &lt;boost/serialization/export.hpp&gt; 
#include &lt;boost/serialization/vector.hpp&gt; 
#include &lt;boost/serialization/nvp.hpp&gt; 

BOOST_CLASS_EXPORT(MeteringProtocolCompositeFactory)  // Boost must include Serialization info for this class even if its not directly referencd (e.g. by its base class) 

namespace boost { 
namespace serialization { 
template&lt;class Archive&gt; inline void save_construct_data(Archive &amp;ar, const MeteringProtocolCompositeFactory *pf, const unsigned int version) { 
        using boost::serialization::make_nvp; 
        ar &amp; make_nvp(&quot;IncludedProtocols&quot;, pf-&gt;getFactories()); 
} 
template&lt;class Archive&gt; inline void load_construct_data(Archive &amp;ar, MeteringProtocolCompositeFactory *pf, const unsigned int version) { 
        using boost::serialization::make_nvp; 
        std::vector&lt;ProtocolFactoryPtr&gt; factories; 
        ar &amp; make_nvp(&quot;IncludedProtocols&quot;, factories); 

        ::new(pf)MeteringProtocolCompositeFactory(factories); 
} 
} 
} 
template&lt;class Archive&gt; void MeteringProtocolCompositeFactory::serialize(Archive &amp;ar, const unsigned int version) { 
        using boost::serialization::make_nvp; 
        ar &amp; make_nvp(&quot;ProtocolFactory&quot;, boost::serialization::base_object&lt;ProtocolFactory&gt;(*this)); 
}
</code></pre>
<p>Zweitens frage ich mich auch, weshalb &lt;boost/serialization/shared_ptr.hpp&gt; scheinbar gar nicht benötigt / verwendet wird beim Ausführen von &quot;oxml &lt;&lt; serialization::make_nvp(&quot;supportedProtocols&quot;, iec1107);&quot; oder &quot;ixml &gt;&gt; serialization::make_nvp(&quot;supportedProtocols&quot;, newProtocolFactory);&quot; ...?</p>
<p>Besten Dank in jedem Fall für eure Antworten und greeetz<br />
Kessi</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1426618</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1426618</guid><dc:creator><![CDATA[KessiMC]]></dc:creator><pubDate>Thu, 27 Dec 2007 02:03:36 GMT</pubDate></item><item><title><![CDATA[Reply to Boost Serialisierung: shared_ptr on Thu, 27 Dec 2007 04:51:08 GMT]]></title><description><![CDATA[<p>boost/serialization/shared_ptr.hpp wird wahrscheinlich indirekt über einen anderen import includiert</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1426636</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1426636</guid><dc:creator><![CDATA[Mutmasser]]></dc:creator><pubDate>Thu, 27 Dec 2007 04:51:08 GMT</pubDate></item><item><title><![CDATA[Reply to Boost Serialisierung: shared_ptr on Thu, 27 Dec 2007 04:55:12 GMT]]></title><description><![CDATA[<p>???</p>
<p>Google spuckt ca. 306 Ergebnisse zu:</p>
<p>boost assertion `new_cid == cid' failed</p>
<p>aus...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1426637</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1426637</guid><dc:creator><![CDATA[Toma][sO]]></dc:creator><pubDate>Thu, 27 Dec 2007 04:55:12 GMT</pubDate></item></channel></rss>