[ROOT] custom Streamer: stream TObject

From: mathes@ik3.fzk.de
Date: Thu Jul 13 2000 - 15:09:06 MEST


Hi,
I have a question concerning custom streamers:
Do I have to write a Streamer (or call the Streamer method) for each base
class of an user defined class ?
In particular, must I call the TObject::Streamer(TBuffer&) from my custom
Streamer ?

The example:
http://root.cern.ch/root/InputOutput.html#streamer
calls the Tnamed, TAttLine and TAttFill Streamers but not the TAtt3D
Streamer

In my application I have:
class TMirrorEvent  : public TObject
 {
  public:
   TMirrorEvent();                     // standard ctor
   TMirrorEvent( MiEvent );            // ctor from MiEvent
   TMirrorEvent( TShmEvent* );         // ctor from TShmEvent
   virtual ~TMirrorEvent();
   
   inline void Dump();                 // 'dump' contents to stdout
   void Update( TShmEvent* );          // update internal references ...
      
				       // access functions for sub structures
  public:
   inline TMirrorEventHeader* EventHeader();
   inline TMirrorPixelData* PixelData();
   inline TMirrorPixelList* PixelList();
   inline TMirrorFADCData* FADCData();

  private:
   MiEvent pMiEvent;
   enum Constructor_t { kCREATE, kMIEVENT, kTSHMEVENT };
   enum Constructor_t      fConstructorType;   // how object was created
   
  private:
   TMirrorEventHeader*     pHeader;            // ptr. to TMirrorEventHeader
   TMirrorPixelData*       pPixelData;         // ptr. to TMirrorPixelData
   TMirrorPixelList*       pPixelList;         // ptr. to TMirrorPixelList
   TMirrorFADCData*        pFADCData;          // ptr. to TMirrorFADCData

   ClassDef(TMirrorEvent,MiEVENTVERSION)
};

with the Streamer():
void TMirrorEvent::Streamer(TBuffer &b)
 {
  if (b.IsReading()) {
    Version_t v = b.ReadVersion();
    if ( v != MiEVENTVERSIONv1 ) {
      cerr << "Version mismatch in TMirrorPixelList::Streamer()!" << endl;
    }
    // is this really needed ?
    TObject::Streamer( b );
  } else {
    b.WriteVersion(TMirrorEvent::IsA());
    // is this really needed ?
    TObject::Streamer( b );
  }
  
  pHeader->Streamer( b );
  pPixelData->Streamer( b );
  pPixelList->Streamer( b );  
  pFADCData->Streamer( b );
}

The other classes (TMirror*) inherit indeed also from TObject, but don't
call TObject::Streamer(). Both versions work (writing and reading), as
long as I don't mix the data files. But what is the really compatible,
recommended way to go ?

Thanks and Regards
  Hermann-Josef

**************************************************************************
*                                                                        *
*   Dr. Hermann-Josef Mathes                                             *
*   KASCADE & AUGER Collaboration                                        *
*   Forschungszentrum Karlsruhe                Phone: +49 7247 822429    *
*   Institut fuer Kernphysik                   FAX:   +49 7247 824075    *
*   POB 3640                                                             *
*   D-76021 Karlsruhe/Germany                  Mail:  mathes@ik3.fzk.de  *
*                                                     hjmathes@web.de    *
*                                                                        *
**************************************************************************
*   Feel free to visit my homepage:                                      *
*          http://www-ik3.fzk.de/~mathes/Welcome.html                    *
*   My software project page for DAQ:                                    *
*          http://www-ik3.fzk.de/~mathes/software/software.html          *
*                                                                        *
*   Visit the institute and project homepages:                           *
*          http://www-ik3.fzk.de/                                        *
*          http://www-ik1.fzk.de/KASCADE_home.html                       *
**************************************************************************



This archive was generated by hypermail 2b29 : Tue Jan 02 2001 - 11:50:29 MET