Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Решение проблемы EInsufficientRtti при преобразовании объектов TSignalBox в JSON в Delphi 11.3.

Delphi , Компоненты и Классы , RTTI

 

Введение

При работе с JSON в Delphi 11.3 разработчики часто сталкиваются с ошибкой EInsufficientRTTI при попытке сериализации объектов, особенно при использовании компонентов TSignalBox. Эта ошибка возникает из-за недостаточной информации о типах во время выполнения (RTTI), что делает невозможным автоматическое преобразование объекта в JSON.

Причины ошибки EInsufficientRTTI

Ошибка EInsufficientRTTI появляется, когда:

  1. Класс не имеет достаточной информации RTTI для сериализации
  2. Свойства класса не опубликованы (не объявлены как published)
  3. Используются сложные типы данных без поддержки сериализации

Основное решение

Для решения проблемы с TSignalBox в Delphi 11.3 необходимо:

  1. Убедиться, что все свойства, которые нужно сериализовать, объявлены как published
  2. Использовать атрибуты JsonReflect для сложных типов
  3. Включить генерацию RTTI для нужных классов

Пример кода:

uses
  System.JSON, System.JSON.Builders, System.JSON.Readers, System.JSON.Types,
  System.Rtti, System.TypInfo;

type
  [JsonReflect(ctTypeObject, rtTypeObject, TSignalBoxInterceptor)]
  TSignalBox = class
  private
    FSignalName: string;
    FSignalValue: Integer;
  published
    property SignalName: string read FSignalName write FSignalName;
    property SignalValue: Integer read FSignalValue write FSignalValue;
  end;

  TSignalBoxInterceptor = class(TJSONInterceptor)
  public
    function ObjectConverter(Data: TObject; Field: string): TObject; override;
    procedure ObjectReverter(Data: TObject; Field: string; Arg: TObject); override;
  end;

Альтернативные решения

1. Использование кастомного сериализатора

function TSignalBox.ToJSON: TJSONObject;
begin
  Result := TJSONObject.Create;
  try
    Result.AddPair('SignalName', FSignalName);
    Result.AddPair('SignalValue', TJSONNumber.Create(FSignalValue));
  except
    Result.Free;
    raise;
  end;
end;

2. Включение RTTI для класса

{$RTTI EXPLICIT METHODS([vcPublic, vcPublished]) 
  PROPERTIES([vcPublic, vcPublished]) 
  FIELDS([vcPrivate, vcProtected, vcPublic])}

3. Использование библиотеки SuperObject

uses
  SuperObject;

function TSignalBox.ToJSON: ISuperObject;
begin
  Result := SO;
  Result.S['SignalName'] := FSignalName;
  Result.I['SignalValue'] := FSignalValue;
end;

Практический пример

Рассмотрим полный пример работы с TSignalBox:

unit SignalBoxUnit;

interface

uses
  System.JSON, System.Classes, System.SysUtils;

type
  TSignalBox = class
  private
    FName: string;
    FValue: Integer;
  published
    property Name: string read FName write FName;
    property Value: Integer read FValue write FValue;
  end;

  TSignalBoxHelper = class helper for TSignalBox
  public
    function ToJSON: TJSONObject;
    procedure FromJSON(AJSON: TJSONObject);
  end;

implementation

{ TSignalBoxHelper }

procedure TSignalBoxHelper.FromJSON(AJSON: TJSONObject);
begin
  if Assigned(AJSON) then
  begin
    FName := AJSON.GetValue<string>('Name');
    FValue := AJSON.GetValue<Integer>('Value');
  end;
end;

function TSignalBoxHelper.ToJSON: TJSONObject;
begin
  Result := TJSONObject.Create;
  try
    Result.AddPair('Name', FName);
    Result.AddPair('Value', TJSONNumber.Create(FValue));
  except
    Result.Free;
    raise;
  end;
end;

end.

Заключение

Ошибка EInsufficientRTTI при работе с TSignalBox в Delphi 11.3 решается несколькими способами. Наиболее надежный метод - использование опубликованных свойств и кастомных интерцепторов JSON. Альтернативные решения включают ручную сериализацию или использование сторонних библиотек для работы с JSON.

Выбор конкретного метода зависит от сложности вашей структуры данных и требований к производительности. Для простых объектов достаточно опубликованных свойств, для сложных структур лучше использовать кастомные сериализаторы.

Создано по материалам из источника по ссылке.

Решение проблемы EInsufficientRTTI при сериализации объектов TSignalBox в Delphi 11.3 включает использование опубликованных свойств, кастомных интерцепторов и альтернативных методов сериализации JSON.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: RTTI ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-14 17:58:22/0.0059609413146973/0