Skip to content

Commit ff71186

Browse files
committed
Add object serialization
1 parent 2b56a92 commit ff71186

1 file changed

Lines changed: 83 additions & 0 deletions

File tree

src/nexusformat/nexus/tree.py

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3314,6 +3314,33 @@ def __deepcopy__(self, memo={}):
33143314
dpcpy._group = None
33153315
return dpcpy
33163316

3317+
def serialize(self):
3318+
"""Serialize the field to a dictionary."""
3319+
return {'name': self.nxname,
3320+
'class': self.__class__.__name__,
3321+
'dtype': str(self.dtype),
3322+
'shape': self.shape,
3323+
'value': self._value,
3324+
'h5opts': self._h5opts,
3325+
'attrs': {k: v._value for k, v in self.attrs.items()}}
3326+
3327+
@classmethod
3328+
def deserialize(cls, serialized_field):
3329+
"""Deserialize the field from a dictionary."""
3330+
# target_cls = _getclass(serialized_field['class'])
3331+
# obj = target_cls.__new__(target_cls)
3332+
obj = cls.__new__(cls)
3333+
obj._name = serialized_field['name']
3334+
obj._class = serialized_field['class']
3335+
obj._dtype = np.dtype(serialized_field['dtype'])
3336+
obj._shape = serialized_field['shape']
3337+
obj._value = serialized_field['value']
3338+
obj._h5opts = serialized_field['h5opts']
3339+
obj._attrs = AttrDict(obj)
3340+
for k, v in serialized_field['attrs'].items():
3341+
obj.attrs[k] = v
3342+
return obj
3343+
33173344
def __iter__(self):
33183345
"""Implement key iteration."""
33193346
try:
@@ -4973,6 +5000,49 @@ def __deepcopy__(self, memo):
49735000
dpcpy._group = None
49745001
return dpcpy
49755002

5003+
def serialize(self):
5004+
"""Serialize the group to a dictionary."""
5005+
if self._entries:
5006+
entries = {k: v.serialize() for k,v in self._entries.items()}
5007+
else:
5008+
entries = None
5009+
return {'name': self.nxname,
5010+
'class': self.__class__.__name__,
5011+
'file': self.nxfilename,
5012+
'entries': entries,
5013+
'attrs': {k: v._value for k,v in self.attrs.items()}}
5014+
5015+
@classmethod
5016+
def deserialize(cls, serialized_group):
5017+
"""Deserialize the group from a dictionary."""
5018+
target_cls = _getclass(serialized_group['class'])
5019+
obj = target_cls.__new__(target_cls)
5020+
obj._name = serialized_group['name']
5021+
obj._class = serialized_group['class']
5022+
if serialized_group['entries'] is not None:
5023+
obj._entries = {}
5024+
for serialized_entry in serialized_group['entries']:
5025+
entry = serialized_group['entries'][serialized_entry]
5026+
if (entry['class'] == 'NXfield' or
5027+
entry['class'] == 'NXlinkfield'):
5028+
obj._entries[entry['name']] = NXfield.deserialize(entry)
5029+
else:
5030+
obj._entries[entry['name']] = NXgroup.deserialize(entry)
5031+
obj._entries[entry['name']]._group = obj
5032+
else:
5033+
obj._entries = None
5034+
obj._attrs = AttrDict(obj)
5035+
for k, v in serialized_group['attrs'].items():
5036+
obj.attrs[k] = v
5037+
if 'file' and Path(serialized_group['file']).is_file():
5038+
obj._filename = serialized_group['file']
5039+
obj._file = NXFile(obj._filename, 'r')
5040+
obj._mode = 'r'
5041+
else:
5042+
obj._file = None
5043+
obj._mode = None
5044+
return obj
5045+
49765046
def walk(self):
49775047
"""Walk through all the values in the group."""
49785048
yield self
@@ -6194,6 +6264,19 @@ def __exit__(self, *args):
61946264
if self.nxfile:
61956265
self.nxfile.__exit__()
61966266

6267+
def serialize(self):
6268+
"""Serialize the root group to a dictionary."""
6269+
serialized_root = super().serialize()
6270+
serialized_root['mtime'] = self.mtime
6271+
return serialized_root
6272+
6273+
@classmethod
6274+
def deserialize(self, serialized_root):
6275+
"""Deserialize the root group from a dictionary."""
6276+
obj = NXgroup.deserialize(serialized_root)
6277+
obj._mtime = serialized_root['mtime']
6278+
return obj
6279+
61976280
def reload(self):
61986281
"""Reload the NeXus file from disk."""
61996282
if self.nxfilemode:

0 commit comments

Comments
 (0)