<?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[Serialisierung mit C++]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe ein paar Fragen zur Serialisierung mit C++. Ich möchte gerne Daten serialisieren, um sie über das Netzwerk zu schicken. Dabei sollen alle möglichen numerischen Datentypen (int, float, etc.) aus C++ serialsiert werden.</p>
<p>Was ist der beste Weg das zu tun, ohne auf externe Libs, wie Boost, zurückgreifen zu müssen?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/299155/serialisierung-mit-c</link><generator>RSS for Node</generator><lastBuildDate>Thu, 13 Aug 2026 06:12:33 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/299155.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 03 Feb 2012 21:47:39 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Serialisierung mit C++ on Fri, 03 Feb 2012 21:47:39 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe ein paar Fragen zur Serialisierung mit C++. Ich möchte gerne Daten serialisieren, um sie über das Netzwerk zu schicken. Dabei sollen alle möglichen numerischen Datentypen (int, float, etc.) aus C++ serialsiert werden.</p>
<p>Was ist der beste Weg das zu tun, ohne auf externe Libs, wie Boost, zurückgreifen zu müssen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2176596</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2176596</guid><dc:creator><![CDATA[Stefan6355]]></dc:creator><pubDate>Fri, 03 Feb 2012 21:47:39 GMT</pubDate></item><item><title><![CDATA[Reply to Serialisierung mit C++ on Fri, 03 Feb 2012 22:08:08 GMT]]></title><description><![CDATA[<p>Entweder selber schreiben, Boost.Serialization oder Google Protocol Buffers verwenden. Ich persönlich würde zu Google Protocol Buffers tendieren, da es Libraries in verschiedenen Sprachen gibt.</p>
<p>Edit:<br />
Oh... erst lesen dann schreiben... tja, wie gesagt, selber schreiben...<br />
Normalerweise mache ich das so, dass ein Klasse fürs schreiben und eine fürs lesen zuständig ist, jeweils mit den entsprechenden Überladungen.</p>
<p>Bsp. für einen Writer/Reader:</p>
<pre><code class="language-cpp">typedef std::vector&lt;unsigned char&gt; ProtocolBuffer;
class ProtocolWriter
{
public:
   ProtocolWriter(ProtocolBuffer&amp; buffer);

   // Gibt die Anzahl geschriebenen Bytes zurück
   std::size_t write(int value);
   std::size_t write(double value);
   std::size_t write(const std::string&amp; value);
   // ...
};

class ProtocolReader
{
public:
   ProtocolReader(ProtocolBuffer&amp; buffer);

   // Gibt die Anzahl gelesenen Bytes zurück
   std::size_t read(int&amp; value);
   std::size_t read(double&amp; value);
   std::size_t read(std::string&amp; value);
};
</code></pre>
<p>Typischerweise mache ich dann einen Header mit fester Länge, z.B. Payload Länge und Message Typ - danach folgt das spezifische Message Layout. Strings codiere ich typischer weise Length Prefixed.</p>
<p>Einige Überladungen kann man auch sparen und dafür ein Funktions-Template machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2176598</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2176598</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Fri, 03 Feb 2012 22:08:08 GMT</pubDate></item><item><title><![CDATA[Reply to Serialisierung mit C++ on Fri, 03 Feb 2012 22:55:17 GMT]]></title><description><![CDATA[<p>theta schrieb:</p>
<blockquote>
<p>Entweder selber schreiben, Boost.Serialization oder Google Protocol Buffers verwenden. Ich persönlich würde zu Google Protocol Buffers tendieren, da es Libraries in verschiedenen Sprachen gibt.</p>
</blockquote>
<p>Ja, ich verwende auf der einen Seite QDataStream für die Serialisierung und Deserialisierung.</p>
<p>Auf der anderen Seite steht mir aber kein Qt zur Verfügung und externe Libs sind nicht möglich.</p>
<p>theta schrieb:</p>
<blockquote>
<p>tja, wie gesagt, selber schreiben...<br />
Normalerweise mache ich das so, dass ein Klasse fürs schreiben und eine fürs lesen zuständig ist, jeweils mit den entsprechenden Überladungen.</p>
</blockquote>
<p>Ja, so in etwa habe ich mir das auch gedacht. Ich habe nur keine Lust jetzt großartige eine Serializer-Klasse zu schreiben mit Byte-Order/Endianness.</p>
<p>Aber es bleibt mir wohl nichts anderes übrig, als das Rad neu zu erfinden. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2176617</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2176617</guid><dc:creator><![CDATA[Stefan6355]]></dc:creator><pubDate>Fri, 03 Feb 2012 22:55:17 GMT</pubDate></item><item><title><![CDATA[Reply to Serialisierung mit C++ on Fri, 03 Feb 2012 23:09:39 GMT]]></title><description><![CDATA[<p>Du kannst mal schauen, wie <a href="http://www.sfml-dev.org/documentation/2.0/" rel="nofollow">SFML 2</a> seine <code>sf::Packet</code> -Klasse aufgebaut hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2176621</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2176621</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 03 Feb 2012 23:09:39 GMT</pubDate></item><item><title><![CDATA[Reply to Serialisierung mit C++ on Fri, 03 Feb 2012 23:19:33 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Du kannst mal schauen, wie <a href="http://www.sfml-dev.org/documentation/2.0/" rel="nofollow">SFML 2</a> seine <code>sf::Packet</code> -Klasse aufgebaut hat.</p>
</blockquote>
<p>Ahh, Danke! Dieses SFML scheint eine recht beschauliche kleine Packet-Klasse zu haben. Die Stream-Operatoren operator&lt;&lt; undoperator&gt;&gt; sind für die wichtigsten C++-Datentypen überladen. Die Klasse scheint eine feste Byte-Order zu verwenden.</p>
<p>Sieht ziemlich schlicht, aber sauber aus. Darauf kann man aufbauen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2176624</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2176624</guid><dc:creator><![CDATA[Stefan6355]]></dc:creator><pubDate>Fri, 03 Feb 2012 23:19:33 GMT</pubDate></item><item><title><![CDATA[Reply to Serialisierung mit C++ on Fri, 03 Feb 2012 23:28:56 GMT]]></title><description><![CDATA[<p>Stefan6355 schrieb:</p>
<blockquote>
<p>Sieht ziemlich schlicht, aber sauber aus. Darauf kann man aufbauen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
</blockquote>
<p>Gilt für ganz SFML. Das Design ist wirklich sehr schön und intuitiv, sowas sieht man sehr selten in C++.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2176628</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2176628</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 03 Feb 2012 23:28:56 GMT</pubDate></item><item><title><![CDATA[Reply to Serialisierung mit C++ on Sat, 04 Feb 2012 19:20:14 GMT]]></title><description><![CDATA[<p>Stefan6355 schrieb:</p>
<blockquote>
<p>Ja, so in etwa habe ich mir das auch gedacht. Ich habe nur keine Lust jetzt großartige eine Serializer-Klasse zu schreiben mit Byte-Order/Endianness.</p>
<p>Aber es bleibt mir wohl nichts anderes übrig, als das Rad neu zu erfinden. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
</blockquote>
<p>Ich verstehe Dein Problem nicht. Du willst kein anderes Serialisierungsframework verwenden aber Du willst es auch nicht selbst schreiben <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> . Also mir fällt beim besten Willen kein anderer Weg ein, als entweder selbst machen oder eben nicht. Das ist doch eine rein binäre Frage.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2176901</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2176901</guid><dc:creator><![CDATA[tntnet]]></dc:creator><pubDate>Sat, 04 Feb 2012 19:20:14 GMT</pubDate></item><item><title><![CDATA[Reply to Serialisierung mit C++ on Sun, 12 Feb 2012 14:30:25 GMT]]></title><description><![CDATA[<p>tntnet schrieb:</p>
<blockquote>
<p>Stefan6355 schrieb:</p>
<blockquote>
<p>Ja, so in etwa habe ich mir das auch gedacht. Ich habe nur keine Lust jetzt großartige eine Serializer-Klasse zu schreiben mit Byte-Order/Endianness.</p>
<p>Aber es bleibt mir wohl nichts anderes übrig, als das Rad neu zu erfinden. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
</blockquote>
<p>Ich verstehe Dein Problem nicht. Du willst kein anderes Serialisierungsframework verwenden aber Du willst es auch nicht selbst schreiben <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> . Also mir fällt beim besten Willen kein anderer Weg ein, als entweder selbst machen oder eben nicht. Das ist doch eine rein binäre Frage.</p>
</blockquote>
<p>Ich habe nicht gesagt das ich kein anderes Framework verwenden will, sondern das ich nicht auf externe Libs, wie Boost, zurückgreifen kann. Ich hatte gehofft das es ein paar fertige Klassen (Open Source) dazu bereits gibt.</p>
<p>Das spielt aber keine Rolle, weil ich mir jetzt ein auf Templates basierendes eigenes Serialisierungs-Framework geschrieben habe. Es ist den Streams von Java (OutputStream, InputStream, ByteArrayOutputStream, ByteArray etc.) nachempfunden und bietet dieselben Schnittstellen, wie QDataStream.</p>
<pre><code class="language-cpp">/**
    * Base class for all input streams.
    */
class InputStream : public Stream
{
public:
    ////////////////////////////////////////////////////////////
    /// Functions to read data from the stream
    ///
    ////////////////////////////////////////////////////////////
    virtual void read(bool&amp;               data, int bit = Bits&lt;bool&gt;::size    ) = 0;
    virtual void read(int8_t&amp;             data, int bit = Bits&lt;int8_t&gt;::size  ) = 0;
    virtual void read(uint8_t&amp;            data, int bit = Bits&lt;uint8_t&gt;::size ) = 0;
    virtual void read(int16_t&amp;            data, int bit = Bits&lt;int16_t&gt;::size ) = 0;
    virtual void read(uint16_t&amp;           data, int bit = Bits&lt;uint16_t&gt;::size) = 0;
    virtual void read(int32_t&amp;            data, int bit = Bits&lt;int32_t&gt;::size ) = 0;
    virtual void read(uint32_t&amp;           data, int bit = Bits&lt;uint32_t&gt;::size) = 0;      
    virtual void read(int64_t&amp;            data, int bit = Bits&lt;int64_t&gt;::size ) = 0;
    virtual void read(uint64_t&amp;           data, int bit = Bits&lt;uint64_t&gt;::size) = 0;       
    virtual void read(float&amp;              data, int bit = Bits&lt;int32_t&gt;::size ) = 0;
    virtual void read(double&amp;             data, int bit = Bits&lt;int64_t&gt;::size ) = 0;
    //virtual void read(const char*         data, int bit = Bits&lt;int8_t&gt;::size  ) = 0;
    //virtual void read(const wchar_t*      data, int bit = Bits&lt;int16_t&gt;::size ) = 0;
    virtual void read(std::string&amp;        data, size_t maxLength, int bit     ) = 0;
    virtual void read(std::wstring&amp;       data, size_t maxLength, int bit     ) = 0;
    virtual void read(void*               data, uint16_t length               ) = 0;

    virtual int read(uint8_t* b, int off, int len) = 0;

    ////////////////////////////////////////////////////////////
    /// Operator &gt;&gt; overloads to read data from the stream
    ///
    ////////////////////////////////////////////////////////////
    virtual InputStream&amp; operator&gt;&gt;(bool&amp;               data) = 0;
    virtual InputStream&amp; operator&gt;&gt;(int8_t&amp;             data) = 0;
    virtual InputStream&amp; operator&gt;&gt;(uint8_t&amp;            data) = 0;
    virtual InputStream&amp; operator&gt;&gt;(int16_t&amp;            data) = 0;
    virtual InputStream&amp; operator&gt;&gt;(uint16_t&amp;           data) = 0;
    virtual InputStream&amp; operator&gt;&gt;(int32_t&amp;            data) = 0;
    virtual InputStream&amp; operator&gt;&gt;(uint32_t&amp;           data) = 0;
    virtual InputStream&amp; operator&gt;&gt;(int64_t&amp;            data) = 0;
    virtual InputStream&amp; operator&gt;&gt;(uint64_t&amp;           data) = 0;
    virtual InputStream&amp; operator&gt;&gt;(float&amp;              data) = 0;
    virtual InputStream&amp; operator&gt;&gt;(double&amp;             data) = 0;
    //virtual InputStream&amp; operator&gt;&gt;(const char*         data) = 0;
    //virtual InputStream&amp; operator&gt;&gt;(const wchar_t*      data) = 0;
    virtual InputStream&amp; operator&gt;&gt;(std::string&amp;        data) = 0;
    virtual InputStream&amp; operator&gt;&gt;(std::wstring&amp;       data) = 0;

    struct true_type  { enum { value = true  }; };
    struct false_type { enum { value = false }; };

    template &lt;typename T&gt;
    void do_read(T&amp; data, int bit, const false_type&amp;) 
    {
        read(data, bit);
    }

    template &lt;typename T&gt;
    void do_read(T&amp; data, int bit, const true_type&amp;) 
    {
        int32_t temp;
        read(temp, bit);
        data = static_cast&lt;T&gt;(temp);
    }
};
</code></pre>
<p>Ich bin zufrieden, ich kann die Byte-Order einstellen, etc. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2180129</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2180129</guid><dc:creator><![CDATA[Stefan6355]]></dc:creator><pubDate>Sun, 12 Feb 2012 14:30:25 GMT</pubDate></item></channel></rss>