Методы сервера DataSnap — ранжирование вложенных объектов

У меня есть клиент/сервер datasnap в Delphi XE6

Я получаю недопустимую операцию указателя в следующем вызове метода сервера на стороне клиента.

S := ClientModule1.ServerMethods1Client.getReport(RunReportObj,
        ReturnFileSize);

когда я отлаживаю (вхожу), он видит, что ошибка находится во вложенном объекте TRunReportObj, который я передаю методу сервера

 TRunReportObject
 private
  ...
  fCriteria: TCriteriaList;
  ...
public
  function AddCrit(Const aField, aOperation: String; Const aValues: TStrings): TCriteriaObject; 
  property CritObjects[index: Integer]: TCriteriaObject read GetCritObject;
  property Criteria: TCriteriaList read fCriteria write fCriteria;
...
end;

TCriteriaList — это TObjectList

TCriteriaObject = class(TJSONParamObject)
  private
    fField: String;
    fOperation: String;
    fValues: TStringList;
    function GetJSONObject: TJSONObject; override;
  public
    property Field: String read fField write fField;
    property Operation: String read fOperation write fOperation;
    property Values: TStringList read fValues write fValues;
    constructor create;
    destructor destroy;override;
  end;

если я изменяю fValues: TStringList на строку, все работает нормально

Итак, проблема связана со свойством списка строк «Значения», которое я убедился, что оно создано и уничтожено.

constructor TCriteriaObject.create;
begin
  inherited Create;
  fValues := TStringList.create;
end;

destructor TCriteriaObject.destroy;
begin
  fValues.Free;
  inherited destroy;
end;

Я думаю, что может быть проблема маршалинга??? Кто-нибудь может это подтвердить?


person John    schedule 06.06.2016    source источник
comment
Вы можете попробовать добавить следующий атрибут в свои FValues: поле TStringList в TCriteriaObject — [JSONReflect(ctTypeObject, rtTypeObject, TStringListInterceptor, nil, True)] и добавить Data.DBXJSONReflect в предложение использования.   -  person Jason    schedule 08.06.2016


Ответы (1)


У меня были похожие проблемы в Delphi XE6. Мне пришлось преобразовать любой TStringList в String.

В твоем случае :-

fValues: строка;

Значения свойств: чтение строки GetValues ​​запись SetValues;

В подпрограммах GetValues ​​и SetValues ​​вам нужно преобразовать в строку и из нее.

person Peter G Evans    schedule 07.06.2016
comment
Извините, что так долго проверял. Да, Питер, это то, что я сделал в качестве немедленного исправления, я надеялся узнать что-нибудь о TStringList. Спасибо! Я приму ваш ответ, так как вы дали правильный ответ. - person John; 07.06.2016