wiki:SerializationNotes

Version 4 (modified by Torben Dannhauer, 15 years ago) (diff)

--

Serialization

Wrapperaufbau

in jeder Klasse unten den Wrapper eintragen.

obne zusätzlich folgendes includieren: #include <osgDB/ObjectWrapper>

#include <osgDB/InputStream>

#include <osgDB/OutputStream>

Dann den wrapper definieren:

REGISTER_OBJECT_WRAPPER( Node, The unique wrapper name

new osg::Node, The proto osg::Node, The class typename "osg::Object osg::Node" ) The inheritance relations

{

Serializers for different members ADD_OBJECT_SERIALIZER( UpdateCallback?, osg::NodeCallback?, NULL ); ADD_BOOL_SERIALIZER( CullingActive?, true ); ADD_HEXINT_SERIALIZER( NodeMask?, 0xffffffff ); ...

}

Funktion des Serializers beim Lesen der Wrapper-Definition

Funktion des ADD_LIST_SERIALIZER(NAME, TYPE):

NAME: Name der public Funktion, unter der der Vector gelesen und geschrieben werden kann TYPE: Typ der Liste. Um es übersichtlich zu halten, muss ein public Typedef durchgeführt werden. dieser kann gemäss c++ syntax mit node::typedef genutzt werden.

Bsp: ADD_LIST_SERIALIZER( ClipPlaneList?, osg::ClipNode::ClipPlaneList? );

Name der Get/Set? Funktionen:

  • getClipPlaneList();
  • setClipPlaneList(..);

Typdefinition des vectors:

zu finden ist dieser Typ gemäß c++ Syntax mit namespace::classname::type (daher muss der typedef public sein, sonst ist er ja von aussen nicht sichtbar)

->zu serialisierendes Element wäre dann im Beispiel: osg::Clipnode::ClipPlaneList?

Wichtig bei enums:

enum <typename> {VA1, VAL2, ...}

variable muss dann anders heißen als der type. Der wrapper NAME muss identisch lauten wie der enum Typ.

Zugriff auf die serialisierten Daten

osgDB::ReaderWriter?* rw = osgDB::Registry::instance()->getReaderWriterForExtension("osgb"); if ( rw ) {

osgDB::ReaderWriter::WriteResult? wr = rw->writeNode( *scene, ostream );

osgDB::ReaderWriter::ReadResult? rr = rw->readNode( istream ); return rr.takeNode(); Node mit takeNode entgegennehmen.

}

De-/Komprimieren des Datenstroms

Um die Nodes zu komprimieren, muss osgDB::ReaderWriter?->readNode(..) und osgDB::ReaderWriter?->writeNode(..) die entsprechende Option mitgegeben werden: "compressor=zlib"

Bsp: osgDB::ReaderWriter::WriteResult? wr = rw->writeNode( *scene, ostream, new osgDB::Options("WriteImageHint?=IncludeData? Compressor=zlib") ); osgDB::ReaderWriter::ReadResult? rr = rw->readNode( istream, new osgDB::Options("WriteImageHint?=IncludeData? Compressor=zlib") );

Transfer size

xml: 739 bytes ASCII: 389 bytes binary uncompressed: 353 bytes binary compressed: 176 bytes