Difference between revisions of "Serializing and deserializing root objects"

From GlueXWiki
Jump to: navigation, search
m
m
Line 51: Line 51:
 
===Example Programs===
 
===Example Programs===
  
[[cMsgRootProducer.cc]] produces a histogram, serializes it, and ships it via the cMsg package. [[cMsgRootConsumer.cc]] receives the cMsg message, extracts the byte buffer and recreates the histogram ([[cMsgRootMakefile|Makefile]]).
+
[[cMsgRootProducer.cc]] produces a histogram, serializes it, and ships it via the cMsg package.
 +
 
 +
[[cMsgRootConsumer.cc]] receives the cMsg message, extracts the byte buffer and recreates the histogram.
 +
 
 +
[[cMsgRootMakefile|Makefile]]) for two example programs.

Revision as of 14:41, 30 June 2009

Introduction

ROOT objects can be serialized to a byte array or 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).


Serialize

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
tm->WriteObject(some_root_object);

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


Deserialize

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 {
public:
   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

cMsgRootProducer.cc produces a histogram, serializes it, and ships it via the cMsg package.

cMsgRootConsumer.cc receives the cMsg message, extracts the byte buffer and recreates the histogram.

Makefile) for two example programs.