@@ -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