По мотивам - Про "примеси", шаблоны и Generic'и
Теперь как чушь становиться не чушью:
msMarshal.mixin.pas
msDiagrammMarshal.pas
Никаких Is и As.
Теперь как чушь становиться не чушью:
msMarshal.mixin.pas
{$IfNDef TmsMarshal} {$Define TmsMarshal} TmsMarshal = class // - шаблонизируем, ибо мы скоро будем сериализовать и другие классы. strict private class var f_Marshal : TJSONMarshal; class var f_UnMarshal : TJSONUnMarshal; class function Marshal: TJSONMarshal; class function UnMarshal: TJSONUnMarshal; public class procedure Serialize(const aFileName: string; const aDiagramm: TClassToSerialize); class procedure DeSerialize(const aFileName: string; const aDiagramm: TClassToSerialize); class destructor Destroy; end;//TmsMarshal {$Else TmsMarshal} // TmsMarshal class function TmsMarshal.UnMarshal: TJSONUnMarshal; begin if (f_UnMarshal = nil) then begin f_UnMarshal := TJSONUnMarshal.Create; f_UnMarshal.RegisterReverter(TmsDiagramm, 'FShapeList', procedure (Data: TObject; Field: String; Args: TListOfObjects) var l_Object: TObject; l_Diagramm : TmsDiagramm; l_msShape: TmsShape; begin Assert(Data Is TmsDiagramm); l_Diagramm := TmsDiagramm(Data); assert(l_Diagramm <> nil); for l_Object in Args do begin l_msShape := l_Object as TmsShape; l_Diagramm.ShapeList.Add(l_msShape); end//for l_Object end );//f_UnMarshal.RegisterReverter end;//f_UnMarshal = nil Result := f_UnMarshal; end; class destructor TmsMarshal.Destroy; begin FreeAndNil(f_Marshal); FreeAndNil(f_UnMarshal); end; class function TmsMarshal.Marshal: TJSONMarshal; begin if (f_Marshal = nil) then begin f_Marshal := TJSONMarshal.Create; f_Marshal.RegisterConverter(TmsDiagramm, 'FShapeList', function (Data: TObject; Field: string): TListOfObjects var l_Shape: ImsShape; l_Index: Integer; begin Assert(Field = 'FShapeList'); SetLength(Result, (Data As TmsDiagramm).ShapeList.Count); l_Index := 0; for l_Shape in (Data As TmsDiagramm).ShapeList do begin Result[l_Index] := (l_Shape As ImsObjectWrap).HackInstance; Inc(l_Index); end; // for l_Shape end );//f_Marshal.RegisterConverter TmsRegisteredShapes.IterateShapes( procedure (aShapeClass: RmsShape) begin f_Marshal.RegisterJSONMarshalled(aShapeClass, 'FRefCount', false); end );//TmsRegisteredShapes.IterateShapes end;//f_Marshal = nil Result := f_Marshal; end; class procedure TmsMarshal.DeSerialize(const aFileName: string; const aDiagramm: TClassToSerialize); var l_StringList: TmsStringList; l_D : TClassToSerialize; begin l_StringList := TmsStringList.Create; try l_StringList.LoadFromFile(aFileName); l_D := UnMarshal.Unmarshal(TJSONObject.ParseJSONValue(l_StringList.Text)) As TClassToSerialize; try aDiagramm.Assign(l_D); finally FreeAndNil(l_D); end;//try..finally finally FreeAndNil(l_StringList); end;//try..finally end; class procedure TmsMarshal.Serialize(const aFileName: string; const aDiagramm: TClassToSerialize); var l_Json: TJSONObject; l_StringList: TmsStringList; begin l_StringList := TmsStringList.Create; try l_Json := nil; try l_Json := Marshal.Marshal(aDiagramm) as TJSONObject; l_StringList.Add(l_Json.toString); finally FreeAndNil(l_Json); end;//try..finally l_StringList.SaveToFile(aFileName); finally FreeAndNil(l_StringList); end;//try..finally end; {$EndIf TmsMarshal}
msDiagrammMarshal.pas
unit msDiagrammMarshal; interface uses JSON, Data.DBXJSONReflect, msDiagramm ; type TClassToSerialize = TmsDiagramm; {$Include msMarshal.mixin.pas} TmsDiagrammMarshal = class(TmsMarshal) end;//TmsDiagrammMarshal implementation uses msShape, SysUtils, msSerializeInterfaces, msRegisteredShapes, msCoreObjects ; {$Include msMarshal.mixin.pas} end.That's all folks.
Никаких Is и As.
Комментариев нет:
Отправить комментарий