Serializing and deserializing root objects

From GlueXWiki
Jump to: navigation, search


ROOT objects can be serialized to a byte array and reconstructed from the byte array quite easily.

One reason to do this might be to store or transport ROOT objects in a way not supported by ROOT itself. An example is transport of a ROOT histogram from a producer to a consumer program via the cMsg package, a publish/subscribe messaging system that will be used extensively in the Hall D online monitoring system (see Example Programs below).


ROOT TMessage objects can hold serialized ROOT objects:

#include "TMessage.h"

// create TMessage object capable of holding serialized ROOT object
TMessage *tm = new TMessage(kMESS_OBJECT);

// fill with serialized version of some ROOT object

// get pointer to TMessage internal buffer holding object and its length (in bytes)
char *buffer     = tm->Buffer();
int bufferLength = tm->Length());


Deserializing involves a trick due to limitations of the TMessage class. The required constructor is protected, so a covering class must be created to expose it:

#include "TMessage.h"

// special class needed to expose protected TMessage constructor
class MyTMessage : public TMessage {
   MyTMessage(void *buf, Int_t len) : TMessage(buf, len) { }

// create special TMessage object from byte buffer, length (in bytes)
MyTMessage *myTM = new MyTMessage(buffer,length);

// reconstruct original object, here assumed to be a histogram
TH1 *hist = (TH1*)myTM->ReadObject(myTM->GetClass());

Example Programs produces a histogram, serializes it, and ships it over the network via the cMsg package to one or more consumer programs. receives the cMsg message, extracts the byte buffer and recreates the histogram. Alternate mechanisms for recreating base objects and casting them to derived objects are shown.

Makefile for two example programs.