[[TracNav(TracNav/TOC)]] = Serialization = == Wrapperaufbau == in jeder Klasse unten den Wrapper eintragen. obne zusätzlich folgendes includieren: #include #include #include 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: - typedef std::vector > ClipPlaneList 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 {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