powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Помогите советом по сериализации
10 сообщений из 10, страница 1 из 1
Помогите советом по сериализации
    #39718587
amadeus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет, помогите найти решение проблемы. Есть самописный json-сериализатор для Delphi XE7 - класс, поддерживающий сериализацию простых свойств, динамических массивов и объектов - потомков этого же класса. Не может сериализовать записи, динамические массивы, содержащие записи и записи, содержащие динамические массивы. Для неизвестных типов (те же запсиси, например) вызывает специальный виртуальный метод, который может быть переопределен в унаследованных классах - в этот метод передаются имя поля, информация о типе и значение (TValue).

Планируется использовать этот сериализатор в большом проекте, где он будет выполнять одну из важных, но второстепенных ролей, но я настаиваю на том, что область, не затрагиваемая им, слишком велика, и простым переопределением в унаследованном классе того виртуального метода здесь не обойдешься - рискуем при большом количестве записей и массивов запутаться, кто занимается чьей сериализацией и прийти все к тем же большим функциям, содержащим ручное перечисление и сохранение параметров.

Дописать сериализатор нет возможности, времени на это никто не даст.

В общем, варианты такие:

1. Пользоваться этим сериализатором: половину работы с простыми типами он сделает автоматически, а остальную половину (сохранение всех возможных record'ов) можно сделать вручную в переопределенном виртуальном методе.

2. Отказаться от своего сериализатора как от неполноценного: основная сложность и есть в сохранении составных типов, а простые типы можно сохранить и вручную (быстрее будет). Вместо этого использовать метод "serialize", переопределяемый от класса к классу, с ручным сохранением всех необходимых данных.

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

В общем, надеюсь на ваши советы.
...
Рейтинг: 0 / 0
Помогите советом по сериализации
    #39718643
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привильней всего - №2.
...
Рейтинг: 0 / 0
Помогите советом по сериализации
    #39718647
amadeus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rgreat , поясните, пожалуйста.
...
Рейтинг: 0 / 0
Помогите советом по сериализации
    #39718651
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В чем проблема допилить сериализацию рекордов и массивов? Я сам это легко реализовал
...
Рейтинг: 0 / 0
Помогите советом по сериализации
    #39718655
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
amadeus,

Ручная сериализация и надежней и быстрей работает.
И вы не зависите от всевозможных глюков в компоненте.
...
Рейтинг: 0 / 0
Помогите советом по сериализации
    #39718656
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А еще можно не сериализовать не нужные поля или нестандартно серилизовать нужные.

Компоненту это не доступно.
...
Рейтинг: 0 / 0
Помогите советом по сериализации
    #39718663
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но при все этом "привильней" не значет "быстрей" или "оптимальней".

Тут вам решать.
...
Рейтинг: 0 / 0
Помогите советом по сериализации
    #39718682
amadeus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rgreat , не могу не согласиться, скорость важна, а все обходы по RTTI медленнее, чем запись напрямую. По вопросу гибкости тоже согласен.
...
Рейтинг: 0 / 0
Помогите советом по сериализации
    #39718687
Фотография Dimonka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня во многих проектах был сериализатор на основе интерфейса под спойлером.
Всё примерно также как ты и описал. Автоматически сериализовывались все public и published свойства, остальное можно было досериализовать вручную через методы Serialize/DeSerialize

Но всё должно было быть унаследовано от базовых классов.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
type
  TXMLPersistent = class abstract(TObject)
  private
    FLoading: Boolean;
    class function EnumToInt<EnumType>(var typeInf: PTypeInfo; enum: EnumType):
        Integer;
    function GetXML: string;
    procedure SetXML(const Value: string);
  protected
    function GetLoading: Boolean; virtual;
  public
    constructor Create; virtual;
    class function BooleanToXStr(b: Boolean): string;
    procedure DeSerialize(ANode: IXMLNode); virtual;
    class function FloatToXString(F: double): string;
    class function GetXEnumName<EnumType: record>(const enum: EnumType): string;
    class function GetXEnumValue<EnumType>(EnumName: Variant): EnumType;
    procedure Reset; virtual;
    procedure Serialize(ANode: IXMLNode); virtual;
    class function XStringToFloat(s: Variant; Def: double = 0): Double;
    class function XStrToBoolean(V: Variant): Boolean;
    property Loading: Boolean read GetLoading write FLoading;
    property XML: string read GetXML write SetXML;
  end;

  TXMLPersistentClass = class of TXMLPersistent;

  TXMLPersistentList<T: TXMLPersistent> = class(TXMLPersistent)
  protected
    FItems: TList<T>;
    function GetCount: Integer;
    function GetItems(Index: Integer): T; inline;
  public
    constructor Create; reintroduce; virtual;
    destructor Destroy; override;
    function Add: T; virtual;
    procedure AddItem(Item: T);
    procedure Clear;
    function Delete(Item: T): Integer;
    procedure DeSerialize(ANode: IXMLNode); override;
    function Move(SubItem: T; MoveUp: boolean): boolean;
    procedure Reset; override;
    procedure Serialize(ANode: IXMLNode); override;
    property Count: Integer read GetCount;
    property Items[Index: Integer]: T read GetItems; default;
  end;

...
Рейтинг: 0 / 0
Помогите советом по сериализации
    #39718813
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В новых версиях джавы будут отказываться от встроенного сериализатора объектов. Из-за проблем совместимости и ненадежности. Это к вопросу о том, а нужен ли он в проекте? Или подойдут обычные методы сохранения-восстановления, определяемые для каждого желаемого класса/типа.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Помогите советом по сериализации
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]