<?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 Serialisation Problem]]></title><description><![CDATA[<p>Hi!</p>
<p>ich hab ein problem mit der Boost Serialisation.<br />
Immer wenn die Anzahl an Unterklassen zu groß wird kann ich die Files nicht mehr Laden. Das es an der Größe liegt bezweifel ich, aber der fehler ist jedenfalls so reproduzierbar...</p>
<p>Das Programm:</p>
<pre><code>_IndexCluster z(0, 1, 2);

	for(int i = 0; i &lt; 10; i++) {
		_IndexCluster a(i, i*1000, i*1000);
		for(int j = 0; j &lt; 100; j++) { //Wähle ich hier z.B: j &lt; 10 funktioniert es... kein crash...
			_IndexCluster b(j*i, j*i*10, j*i*100);
			a.insert(b);
		}
		z.insert(a);
	}

	ofstream treeout(&quot;bla.Arv&quot;);
	{
		boost::archive::binary_oarchive oa(treeout);
		oa &lt;&lt; z;
	}

	_IndexCluster n;
    {
        std::ifstream treein(&quot;bla.Arv&quot;);
		boost::archive::binary_iarchive ia(treein);
        ia &gt;&gt; n;	// crash!
    }
</code></pre>
<p>Die Klasse:</p>
<pre><code>class _IndexCluster {
	public:
		 _IndexCluster();
		 _IndexCluster(_u32 key, _u32 byteOffset);
		 _IndexCluster(_u32 key, _u32 byteOffset, _u32 size);
		~_IndexCluster();

		void					insert			(_IndexCluster obj);

	private:
		friend class boost::serialization::access;
		template&lt;class Archive&gt;
		void	serialize(Archive&amp; ar, _u16 version) {
			ar &amp; m_Key;
			ar &amp; m_byteOffset;
			ar &amp; m_Size;
			ar &amp; m_subCluster;
		}

		_u32					m_Key;
		_u32					m_byteOffset;
		_u32					m_Size;
		vector&lt;_IndexCluster&gt;	m_subCluster;
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/324466/boost-serialisation-problem</link><generator>RSS for Node</generator><lastBuildDate>Tue, 14 Jul 2026 08:40:37 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/324466.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 18 Mar 2014 12:58:59 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Boost Serialisation Problem on Tue, 18 Mar 2014 12:58:59 GMT]]></title><description><![CDATA[<p>Hi!</p>
<p>ich hab ein problem mit der Boost Serialisation.<br />
Immer wenn die Anzahl an Unterklassen zu groß wird kann ich die Files nicht mehr Laden. Das es an der Größe liegt bezweifel ich, aber der fehler ist jedenfalls so reproduzierbar...</p>
<p>Das Programm:</p>
<pre><code>_IndexCluster z(0, 1, 2);

	for(int i = 0; i &lt; 10; i++) {
		_IndexCluster a(i, i*1000, i*1000);
		for(int j = 0; j &lt; 100; j++) { //Wähle ich hier z.B: j &lt; 10 funktioniert es... kein crash...
			_IndexCluster b(j*i, j*i*10, j*i*100);
			a.insert(b);
		}
		z.insert(a);
	}

	ofstream treeout(&quot;bla.Arv&quot;);
	{
		boost::archive::binary_oarchive oa(treeout);
		oa &lt;&lt; z;
	}

	_IndexCluster n;
    {
        std::ifstream treein(&quot;bla.Arv&quot;);
		boost::archive::binary_iarchive ia(treein);
        ia &gt;&gt; n;	// crash!
    }
</code></pre>
<p>Die Klasse:</p>
<pre><code>class _IndexCluster {
	public:
		 _IndexCluster();
		 _IndexCluster(_u32 key, _u32 byteOffset);
		 _IndexCluster(_u32 key, _u32 byteOffset, _u32 size);
		~_IndexCluster();

		void					insert			(_IndexCluster obj);

	private:
		friend class boost::serialization::access;
		template&lt;class Archive&gt;
		void	serialize(Archive&amp; ar, _u16 version) {
			ar &amp; m_Key;
			ar &amp; m_byteOffset;
			ar &amp; m_Size;
			ar &amp; m_subCluster;
		}

		_u32					m_Key;
		_u32					m_byteOffset;
		_u32					m_Size;
		vector&lt;_IndexCluster&gt;	m_subCluster;
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2389553</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2389553</guid><dc:creator><![CDATA[cl90]]></dc:creator><pubDate>Tue, 18 Mar 2014 12:58:59 GMT</pubDate></item><item><title><![CDATA[Reply to Boost Serialisation Problem on Tue, 18 Mar 2014 19:11:42 GMT]]></title><description><![CDATA[<ol>
<li>Du solltest keine reservierten Bezeichner verwenden.</li>
<li><code>std::vector</code> mit nem incomplete type? Ich denke nicht dass das geht.</li>
<li>Guck mal wo es crasht, und wieso. Mit nem Debugger geht das sehr leicht. Rumraten ist relativ unspannend.</li>
</ol>
]]></description><link>https://www.c-plusplus.net/forum/post/2389617</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2389617</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 18 Mar 2014 19:11:42 GMT</pubDate></item><item><title><![CDATA[Reply to Boost Serialisation Problem on Wed, 19 Mar 2014 07:03:21 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<ol start="3">
<li>Guck mal wo es crasht, und wieso. Mit nem Debugger geht das sehr leicht. Rumraten ist relativ unspannend.</li>
</ol>
</blockquote>
<p>Die exakte stelle ist im code angegeben. In den Boost funrktionen rumdebuggen macht keinen spaß, das ist zu komplex.</p>
<p>Was meinst du mit reservierten Bezeichner?<br />
Das problem liegt sicher in der Speicherverwaltung. Irgendwas rechnet nicht damit das so viel Speicher gebraucht wird und schreibt in Bereiche die nicht zulässig sind -&gt; exception.</p>
<p>Aber wie sorge ich dafür das entweder boost schnallt das es mehr platz braucht, oder wie weise ich meiner Zielklasse wo reingeschrieben wird mehr speicher zu?</p>
<p>edit: Das hier ist die Fehlermeldung die kommt.</p>
<pre><code>Unhandled exception at at 0x758EC41F in StreamParsing.exe: Microsoft C++ exception: boost::archive::archive_exception at memory location 0x003C61EC.
</code></pre>
<p>gruß,<br />
Chris</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2389679</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2389679</guid><dc:creator><![CDATA[cl90]]></dc:creator><pubDate>Wed, 19 Mar 2014 07:03:21 GMT</pubDate></item><item><title><![CDATA[Reply to Boost Serialisation Problem on Wed, 19 Mar 2014 09:02:31 GMT]]></title><description><![CDATA[<p>cl90 schrieb:</p>
<blockquote>
<p>Was meinst du mit reservierten Bezeichner?</p>
</blockquote>
<p>Unterstrich am Anfang gefolgt von GROSSBUCHSTABEN.</p>
<p>Es fehlt ein kompilierbares Beispiel. Das musst Du noch liefern.</p>
<p>Beachte dabei auch hustbaers Hinweis auf <code>incomplete types</code> .<br />
Nicht jeder Compiler schluckt es, wenn Du solche in stl Container steckst. (Es ist sogar explizit nicht erlaubt!)</p>
<pre><code class="language-cpp">#include &lt;vector&gt;

struct gadget{
  std::vector&lt;gadget&gt; v; // gadget ist hier nur deklariert (aka incomplete)
};
</code></pre>
<p>Ergibt:</p>
<pre><code>Furble Wurble@sinsemilla /tmp $ g++ -c -std=c++11 -Wall -pedantic -g -D_GLIBCXX_CONCEPT_CHECKS -D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC bla.cc -o bla.o
In file included from /usr/lib/gcc/x86_64-pc-linux-gnu/4.7.3/include/g++-v4/bits/concept_check.h:55:0,
                 from /usr/lib/gcc/x86_64-pc-linux-gnu/4.7.3/include/g++-v4/bits/move.h:34,
                 from /usr/lib/gcc/x86_64-pc-linux-gnu/4.7.3/include/g++-v4/bits/stl_pair.h:61,
                 from /usr/lib/gcc/x86_64-pc-linux-gnu/4.7.3/include/g++-v4/bits/stl_algobase.h:65,
                 from /usr/lib/gcc/x86_64-pc-linux-gnu/4.7.3/include/g++-v4/vector:61,
                 from bla.cc:1:
/usr/lib/gcc/x86_64-pc-linux-gnu/4.7.3/include/g++-v4/bits/boost_concept_check.h: In instantiation of ‘struct __gnu_cxx::_SGIAssignableConcept&lt;gadget&gt;’:
/usr/lib/gcc/x86_64-pc-linux-gnu/4.7.3/include/g++-v4/bits/stl_vector.h:212:1:   required from ‘class std::__cxx1998::vector&lt;gadget, std::allocator&lt;gadget&gt; &gt;’
/usr/lib/gcc/x86_64-pc-linux-gnu/4.7.3/include/g++-v4/debug/vector:45:11:   required from ‘class std::__debug::vector&lt;gadget&gt;’
bla.cc:4:23:   required from here
/usr/lib/gcc/x86_64-pc-linux-gnu/4.7.3/include/g++-v4/bits/boost_concept_check.h:214:9: error: ‘__gnu_cxx::_SGIAssignableConcept&lt;_Tp&gt;::__a’ has incomplete type
bla.cc:3:8: error: forward declaration of ‘struct gadget’
[...]
</code></pre>
<p>Beachte Z.12.</p>
<p>Du kannst z.B. auf <code>boost::container::vector</code> ausweichen. Damit gibt es bei mir z.B. keine Probleme. (Etwas nach Lust und Laune umbenamst und umgestellt):</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;fstream&gt;

#include &lt;boost/container/vector.hpp&gt;
#include &lt;boost/archive/binary_oarchive.hpp&gt;
#include &lt;boost/archive/binary_iarchive.hpp&gt;

class indexcluster : private boost::container::vector&lt;indexcluster&gt; {
  using impl = boost::container::vector&lt;indexcluster&gt;;
public:
  indexcluster(uint32_t key=0u, uint32_t byteOffset=0u, uint32_t size=0u)
    : m_Key{key}, m_byteOffset{byteOffset}, m_Size{size}
  {
  }
  using impl::push_back;
private:
  friend class boost::serialization::access;
  template&lt;class Archive&gt;
  void    serialize(Archive&amp; ar, const unsigned int version) {
    ar &amp; boost::serialization::base_object&lt;impl&gt;(*this);
    ar &amp; m_Key;
    ar &amp; m_byteOffset;
    ar &amp; m_Size;
  }

  uint32_t                    m_Key;
  uint32_t                    m_byteOffset;
  uint32_t                    m_Size;
};

template&lt;class Archive&gt;
void serialize(Archive &amp; ar, boost::container::vector&lt;indexcluster&gt;&amp; v, const unsigned int version)
{
  for(auto&amp; a : v)
    ar &amp; a;
}

int main(){
  indexcluster z(0, 1, 2);

  for(int i = 0; i &lt; 10; i++) {
    indexcluster a(i, i*1000, i*1000);
    for(int j = 0; j &lt; 100; j++) { //Wähle ich hier z.B: j &lt; 10 funktioniert es... kein crash...
      indexcluster b(j*i, j*i*10, j*i*100);
      a.push_back(b);
    }
    z.push_back(a);
  }

  std::ofstream treeout(&quot;bla.Arv&quot;);
  {
    boost::archive::binary_oarchive oa(treeout);
    oa &lt;&lt; z;
  }

  indexcluster n;
  {
    std::ifstream treein(&quot;bla.Arv&quot;);
    boost::archive::binary_iarchive ia(treein);
    ia &gt;&gt; n;    // crash!
  }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2389694</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2389694</guid><dc:creator><![CDATA[Furble Wurble]]></dc:creator><pubDate>Wed, 19 Mar 2014 09:02:31 GMT</pubDate></item><item><title><![CDATA[Reply to Boost Serialisation Problem on Wed, 19 Mar 2014 09:06:01 GMT]]></title><description><![CDATA[<p>cl90 schrieb:</p>
<blockquote>
<p>hustbaer schrieb:</p>
<blockquote>
<ol start="3">
<li>Guck mal wo es crasht, und wieso. Mit nem Debugger geht das sehr leicht. Rumraten ist relativ unspannend.</li>
</ol>
</blockquote>
<p>Die exakte stelle ist im code angegeben. In den Boost funrktionen rumdebuggen macht keinen spaß, das ist zu komplex.</p>
</blockquote>
<p>Debuggen macht meistens kaum Spaß, weil es eben Fehlersuche ist.</p>
<p>cl90 schrieb:</p>
<blockquote>
<p>Was meinst du mit reservierten Bezeichner?</p>
</blockquote>
<p>Bezeichner, die mit einem oder zwei Unterstrichen anfangen sind für den Compilerhersteller reserviert. D.h. der könnte standardkonform ein Makro haben welches <em>_IndexCluster</em> heisst und bei Benutzung die Festplatte formatiert.</p>
<p>cl90 schrieb:</p>
<blockquote>
<p>Das problem liegt sicher in der Speicherverwaltung. Irgendwas rechnet nicht damit das so viel Speicher gebraucht wird und schreibt in Bereiche die nicht zulässig sind -&gt; exception.</p>
</blockquote>
<p>Das Problem liegt &quot;sicher&quot; irgendwo?!<br />
Und sowenig Speicher wie du da bräuchtest, da lacht ein heutiger Computer aus Langeweile drüber (~1000000 Elemente.....)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2389695</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2389695</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Wed, 19 Mar 2014 09:06:01 GMT</pubDate></item><item><title><![CDATA[Reply to Boost Serialisation Problem on Thu, 20 Mar 2014 07:10:02 GMT]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p>Danke für die vielen Tipps, letztendlich lag es daran das ich die fstreams nicht mit ios::binary geöffnet habe. Ich werde vlt tozdem den Boost vector einmal austesten und sehen ob der vieleicht weniger Overhead in den Fieles erzeugt.</p>
<p>Ich weiß das mit den reservierten Bezeichnern gefällt mir auch nicht, aber es ist hier in der Programmiergruppe so im StyleGuide verankert.</p>
<p>Gruß,<br />
Chris</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2389900</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2389900</guid><dc:creator><![CDATA[cl90]]></dc:creator><pubDate>Thu, 20 Mar 2014 07:10:02 GMT</pubDate></item></channel></rss>