Difference between revisions of "Serializing and deserializing root objects"

From GlueXWiki
Jump to: navigation, search
m
m
Line 3: Line 3:
 
ROOT objects can be serialized to a byte array or reconstructed from the byte array quite easily.  One reason to do this might
 
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  
 
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 section on Example Programs below).
+
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).
  
  
Line 26: Line 26:
  
 
===Deserialize===
 
===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:
 +
 +
<pre>
 +
// class needed to expose protected TMessage constructor
 +
class MyTMessage : public TMessage {
 +
public:
 +
  MyTMessage(void *buf, Int_t len) : TMessage(buf, len) { }
 +
};
 +
</pre>
 +
 +
 +
  
  

Revision as of 14:28, 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. They are filled via the write() method:

#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 and length
char *buffer     = tm->Buffer();
int bufferLength = tm->Length());    // in bytes


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:

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




Example Programs

cMsgRootProducer.cc,cMsgRootConsumer.cc,Makefile Examples demonstrate transport via cMsg package.