Re: [ROOT] Sending mixed templated/non-templated objects through ROOT I/O

From: Fons Rademakers (Fons.Rademakers@cern.ch)
Date: Tue Oct 17 2000 - 18:05:37 MEST


Hi Brett,

  in the example of collections (like you mention below) the reading is done
via: 

inline TBuffer &operator>>(TBuffer &buf, const TObject *&obj)
   { obj = buf.ReadObject(0); return buf; }

as you can see this calls TBuffer::ReadObject(). ReadObject() will find as
first token for a new object its class identifier (either class name of
reference
to already read class name). Then it will do TClass::New() to create a new
object
of the correct class and next it will read the data members for the object by
calling the class' Streamer() method. Simple magic :-).

Cheers, Fons.




Brett Viren wrote:
> 
> Valeri Fine (Faine) writes:
>  >
>  >  You may provide a custom Registry::Streamer method for you class
>  >  That defines how to stream you objects from your container into ROOT buffer and how to recreate
>  >  your container back.
>  >
>  > You can use
>  > http://root.cern.ch/root/htmldoc/src/TCollection.cxx.html#TCollection:Streamer
>  >
>  > as example.
>  >   Hope this helps.
> 
> It does somewhat.  I was thinking something like this must be
> necessary, but I am still confused about the following: In the
> b.IsReading() block of TCollection's Streamer (which I will need to
> mirror), one loops over the number of objects to input and there is
> code like:
> 
>         TObject* obj;
>         //...
>         loop {
>              b >> obj;
>         }
> 
> If I write a RegistryItemXxx<T>:RegistryItem:TObject object in the
> ``IsWriting'' block, how will ROOT know to give me this full object
> back, when all I call is TObject's operator>>().
> 
> I know that rootcint will generate an operator>>(TBuffer&,Class*&) for
> the Class it is run on.  Is this somehow called durring ``b >> obj;''?
> 
> Maybe this magic (using A.C. Clark's definition) is something
> fundamental (seperate from the complication of templates) about ROOT's
> I/O that I don't understand.
> 
> Thanks,
> -Brett.

-- 
Org:    CERN, European Laboratory for Particle Physics.
Mail:   1211 Geneve 23, Switzerland
E-Mail: Fons.Rademakers@cern.ch              Phone: +41 22 7679248
WWW:    http://root.cern.ch/~rdm/            Fax:   +41 22 7677910



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