Belle II Software development
Belle2::Stream Namespace Reference

Define (de)serialization methods for TObject. More...

Functions

std::string serializeAndEncode (const TObject *obj)
 Convert given TObject into encoded byte stream (for storing in XML).
 
TObject * deserializeEncodedRawData (const std::string &base64Data)
 Convert given serialized raw data back into TObject.
 

Detailed Description

Define (de)serialization methods for TObject.

This code is also exported to Python, after 'from ROOT import Belle2' it is available as Belle2.Stream.

Function Documentation

◆ deserializeEncodedRawData()

TObject * deserializeEncodedRawData ( const std::string & base64Data)

Convert given serialized raw data back into TObject.

Returns a pointer to the deserialized object, might be NULL if conversion was impossible. User is responsible for deletion.

If input is not well-formed base64-encoded data, this might crash.

Definition at line 54 of file Stream.cc.

55{
56 if (base64Data.empty())
57 return nullptr;
58
59 //convert data back into raw byte stream
60 const TString& data(TBase64::Decode(base64Data.c_str()));
61
62 StreamMsg msg(data.Data(), data.Length());
63 //some checking
64 if (msg.What() != kMESS_OBJECT or msg.GetClass() == nullptr) {
65 return nullptr;
66 }
67 auto* obj = static_cast<TObject*>(msg.ReadObjectAny(msg.GetClass()));
68
69 return obj;
70}

◆ serializeAndEncode()

std::string serializeAndEncode ( const TObject * obj)

Convert given TObject into encoded byte stream (for storing in XML).

Returns base64-encoded TMessage.

Definition at line 27 of file Stream.cc.

28{
29 TMessage::EnableSchemaEvolutionForAll();
30
31 TMessage msg(kMESS_OBJECT);
32 msg.SetWriteMode();
33
34 msg.SetCompressionLevel(1);
35
36 msg.WriteObject(obj);
37 msg.Compress(); //only does something if compression active
38
39 //convert TMessage into base64-encoded string
40 char* buf = msg.Buffer();
41 UInt_t len = msg.Length();
42
43 // using the compressed buffer causes a seg fault (double free)
44 // this can be tested with the unit-test StreamTest.raw
45 // if (msg.CompBuffer()) {
46 // buf = msg.CompBuffer();
47 // len = msg.CompLength();
48 // }
49
50 const std::string& encodedStr(TBase64::Encode(buf, len).Data());
51 return encodedStr;
52}