ROOT Version: 6.26/04
Platform: Fedora 35
Compiler: gcc 11.3
At one point, we were producing something like:
class Foo : public TObject
{
int metadata;
int more_metadata;
int even_more_metadata;
short data[1000];
ClassDef(Foo,1)
};
Then, in anticipation of having something similar but with a different datatype, we switched to:
class IFoo : public TObject
{
int metadata;
int more_metadata;
int even_more_metadata;
ClassDef(IFoo,1);
}
class Foo : public IFoo
{
short data[1000];
ClassDef(Foo,2);
}
class FloatyFoo : public IFoo
{
float data[1000];
ClassDef(FloatyFoo,1);
}
and thanks to automatic schema migration, things went relatively fine and we could read new and old data with no problem.
Later, we never actually used FloatyFoo
so we decided we should get rid of it, renderingIFoo
useless.
But then trying to remove IFoo
and go back to the old data format (with an incremented version number) as
class Foo : public TObject
{
int metadata;
int more_metadata;
int even_more_metadata;
short data[1000];
ClassDef(Foo,3)
};
does not allow reading data written in version 2 properly (the metadata is wrong; reading data from version 1 is fine of course).
I do a bit of reading and think that using #pragma read
might help, so I try something like:
#pragma read \
sourceClass="Foo" \
version="[2]" \
targetClass="Foo"\
source="int metadata; int more_metadata; int even_more_metadata;"\
target="metadata,more_metadata,even_more_metadata"\
code="{ metadata=onfile.metadata; more_metadata=onfile.more_metadata; even_more_metadata=onfile.even_more_metadata; }"
But this segfaults when calling TClass::GetRealData()
. Changing the sourceClass to IFoo
just doesn’t do anything at all (verified by adding a print statement in the code).
Is it possible to get rid of IFoo
in this case, or are we stuck with it? (I suppose maybe there’s a solution with #pragma readraw
or a custom Streamer()
, but that sounds like a pain…). Or is this supposed to work but somehow is not working in my configuration?