anchor.diff:        Skip := True;
         PostError('Unsupported value type: ' + GetTypeName( System.TypeInfo(T)));
       end;
  +  end;
  +end;
  +
  +function TSvAbstractSerializer<T>.TryDeserializeContainer(AArray: T; var AValue: TValue;
  +  AType: TRttiType; var ACreated: Boolean; AProp: TRttiProperty; const AObj: TValue; var ASkip: Boolean): Boolean;
  +var
  +  LEnumMethod, LClearMethod: TRttiMethod;
  +  LParamsArray: TArray<TRttiParameter>;
  +  arrVal: array of TValue;
  +  LJsonValue: T;
  +  LEnumArray: TArray<TEnumEntry<T>>;
  +  i, x: Integer;
  +  LEnumerator: TValue;
  +begin
  +  Result := False;
  +  LEnumMethod := TSvRttiInfo.GetBasicMethod('Add', AType);
  +  if Assigned(LEnumMethod) and ( (Assigned(AProp)) or not (AValue.IsEmpty)  ) then
  +  begin
  +
  +    if AValue.IsEmpty and Assigned(AProp) then
  +      AValue := TSvRttiInfo.GetValue(AProp, AObj);
  +   // AValue := AProp.GetValue(AObj);
  +
  +    if (AValue.IsObject) and (AValue.AsObject = nil) then
  +    begin
  +      AValue := TSvRttiInfo.CreateType(AProp.PropertyType.Handle);
  +      ACreated := True;
  +    end;
  +
  +    LClearMethod := TSvRttiInfo.GetBasicMethod('Clear', AType);
  +    if Assigned(LClearMethod) and (Length(LClearMethod.GetParameters) = 0) then
  +    begin
  +      LClearMethod.Invoke(AValue, []);
  +    end;
  +
  +    LParamsArray := LEnumMethod.GetParameters;
  +
  +    if Length(LParamsArray) > 1 then
  +    begin
  +      SetLength(arrVal, Length(LParamsArray));
  +      //probably we are dealing with key value pair class like TDictionary
  +      for i := 0 to GetArraySize(AArray) - 1 do
  +      begin
  +        LJsonValue := GetArrayElement(AArray, i);
  +
  +      //  Assert(Length(LParamsArray) = GetObjectSize(LJsonValue), 'Parameters count differ');
  +        if IsObject(LJsonValue) then
  +        begin
  +          LEnumArray := EnumerateObject(LJsonValue);
  +          for x := 0 to Length(LEnumArray) - 1 do
  +          begin
  +            arrVal[x] := SetValue(LEnumArray[x].Value,
  +              AObj, nil, LParamsArray[x].ParamType, ASkip);
  +          end;
  +        end
  +        else if IsArray(LJsonValue) then
  +        begin
  +          for x := 0 to GetArraySize(LJsonValue) - 1 do
  +          begin
  +            arrVal[x] :=
  +              SetValue(GetArrayElement(LJsonValue, x), AObj, nil, LParamsArray[x].ParamType, ASkip);
  +          end;
  +        end;
  +
  +        LEnumerator := LEnumMethod.Invoke(AValue, arrVal);
  +      end;
  +    end
  +    else
  +    begin
  +      SetLength(arrVal, GetArraySize(AArray));
  +
  +      for i := 0 to Length(arrVal)-1 do
  +      begin
  +        LJsonValue := GetArrayElement(AArray, i);
  +        {TODO -oLinas -cGeneral : fix arguments}
  +        //AParams[0].ParamType.AsInstance.
  +        arrVal[i] := SetValue(LJsonValue, AObj, nil, LParamsArray[0].ParamType, ASkip);
  +        LEnumerator := LEnumMethod.Invoke(AValue, [arrVal[i]]);
  +      end;
  +    end;
  +
  +    Result := True;
  +
  +    {if ACreated then
  +    begin
  +      Result := AValue;
  +      ASkip := False;
  +      Exit;
  +    end;
  +    ASkip := True;  }
     end;
   end;
   
  
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:   begin
      if AFrom.AsObject is TDataset then
      begin
        Result := SerializeDataset(AFrom);
      end
      else
      begin
        if IsTypeEnumerable(LType, LEnumMethod) then
        begin
          Result := SerializeEnumerable(AFrom, LEnumMethod);
        end
        else
        begin
  