anchor.diff:    begin
       if AFrom.AsObject is TDataset then
       begin
  -      LDst := TDataSet(AFrom.AsObject);  
  -      Result := CreateArray;
  -      LDst.DisableControls;
  -      FormatSettings := FFormatSettings;
  -      try
  -        iRecNo := LDst.RecNo;
  -        LDst.First;
  -        while not LDst.Eof do
  -        begin
  -          LJsonObject := CreateObject;
  -          for i := 0 to LDst.Fields.Count - 1 do
  -          begin
  -            if LDst.Fields[i].IsNull then
  -            begin
  -              ObjectAdd(LJsonObject, LDst.Fields[i].FieldName, CreateNull);
  -            end
  -            else
  -            begin
  -              ObjectAdd(LJsonObject, LDst.Fields[i].FieldName, CreateString(LDst.Fields[i].AsString));
  -            end;  
  -          end; 
  -          ArrayAdd(Result, LJsonObject);
  -          LDst.Next;
  -        end;
  -
  -        LDst.RecNo := iRecNo;
  -      finally
  -        FormatSettings := FOldFormatSettings;
  -        LDst.EnableControls;
  -      end;
  +      Result := SerializeDataset(AFrom);
       end
       else
       begin
         if IsTypeEnumerable(LType, LEnumMethod) then
         begin
  -        //enumerator exists
  -        Result := CreateArray;
  -        LJsonArray := Result;
  -        LEnumerator := LEnumMethod.Invoke(AFrom,[]);
  -        LEnumType :=  TSvRttiInfo.GetType(LEnumerator.TypeInfo);
  -        LMoveNextMethod := LEnumType.GetMethod('MoveNext');
  -        LCurrentProp := LEnumType.GetProperty('Current');
  -        Assert(Assigned(LMoveNextMethod), 'MoveNext method not found');
  -        Assert(Assigned(LCurrentProp), 'Current property not found');
  -        while LMoveNextMethod.Invoke(LEnumerator,[]).asBoolean do
  -        begin
  -          ArrayAdd(LJsonArray, GetValue(LCurrentProp.GetValue(LEnumerator.AsObject), LCurrentProp));
  -        end;
  -
  -        if LEnumerator.IsObject then
  -        begin
  -          LEnumerator.AsObject.Free;
  -        end;
  +        Result := SerializeEnumerable(AFrom, LEnumMethod);
         end
         else
         begin
  
positive.code:     procedure EndSerialization(); override;
      procedure BeginDeSerialization(AStream: TStream); override;
      procedure EndDeSerialization(AStream: TStream); override;
  
      function FindRecordFieldName(const AFieldName: string; ARecord: TRttiRecordType): TRttiField; virtual;
  
  
negative.code:   i: Integer;
    LField: TRttiField ;
    LRecordType: TRttiRecordType ;
    LObject: TObject;
    LEnumerator: TArray<TEnumEntry<T>>;
  begin
    if Assigned(AType) then
    begin
      case AType.TypeKind of
        tkRecord:
        begin
          TValue.MakeWithoutCopy(nil, AType.Handle, Result);
          LRecordType := TSvRttiInfo.GetType(AType.Handle).AsRecord;
  
          LEnumerator := EnumerateObject(AJsonObject);
          for i := 0 to Length(LEnumerator) - 1 do
          begin
            //search for property name
            LField := FindRecordFieldName(LEnumerator[i].Key, LRecordType);
            if Assigned(LField) then
            begin
              {DONE -oLinas -cGeneral : fix arguments}
              LField.SetValue(GetRawPointer(Result),
                SetValue(LEnumerator[i].Value, AObj, nil, LField.FieldType, ASkip));
            end;
          end;
        end;
        tkClass:
        begin
          if Assigned(AProp) and ( (AObj.IsObject) and (AObj.AsObject <> nil)) then
          begin
            Result := TSvRttiInfo.GetValue(AProp, AObj);
            if (Result.IsObject) and (Result.AsObject = nil) then
            begin
              Result := TSvRttiInfo.CreateType(AType.Handle);
            end;
            SetClassProperties(Result, ASkip, AType, AJsonObject);
          end
          else
          begin
  