anchor.diff:      FErrors.Add(ErrorText);
   end;
   
  +function TSvAbstractSerializer<T>.SerializeDataset(const ADataset: TValue): T;
  +var
  +  LDst: TDataSet;
  +  iRecNo, i: Integer;
  +  LJsonObject: T;
  +begin
  +  LDst := TDataSet(ADataset.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;
  +end;
  +
  +function TSvAbstractSerializer<T>.SerializeEnumerable(const AEnumerable: TValue; AEnumMethod: TRttiMethod): T;
  +var
  +  LEnumerator: TValue;
  +  LEnumType: TRttiType;
  +  LMoveNextMethod: TRttiMethod;
  +  LCurrentProp: TRttiProperty;
  +begin
  +  Result := CreateArray;
  +  LEnumerator := AEnumMethod.Invoke(AEnumerable,[]);
  +  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(Result, GetValue(LCurrentProp.GetValue(GetRawPointer(LEnumerator)), LCurrentProp));
  +  end;
  +
  +  if LEnumerator.IsObject then
  +  begin
  +    LEnumerator.AsObject.Free;
  +  end;
  +end;
  +
   procedure TSvAbstractSerializer<T>.SerializeObject(const AKey: string; const obj: TValue;
     AStream: TStream; ACustomProps: TStringDynArray);
   var
  
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:         ASkip := True;
        end;
      end;
    end;
  end;
  
  function TSvAbstractSerializer<T>.DoSetFromString(AJsonString: T; AType: TRttiType;
  