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

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

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

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

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

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

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

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

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

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

Тут вам решать.
...
Рейтинг: 0 / 0
17.10.2018, 12:10
    #39718682
amadeus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите советом по сериализации
rgreat , не могу не согласиться, скорость важна, а все обходы по RTTI медленнее, чем запись напрямую. По вопросу гибкости тоже согласен.
...
Рейтинг: 0 / 0
17.10.2018, 12:14
    #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
17.10.2018, 14:35
    #39718813
JayDi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите советом по сериализации
В новых версиях джавы будут отказываться от встроенного сериализатора объектов. Из-за проблем совместимости и ненадежности. Это к вопросу о том, а нужен ли он в проекте? Или подойдут обычные методы сохранения-восстановления, определяемые для каждого желаемого класса/типа.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Помогите советом по сериализации / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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