Как сериализовать тип Delphi TObjectList <TMyClass> для XML с помощью TJvAppXMLFileStorage?

77
6

Раньше для сохранения настроек некоторых приложений я использовал:


    A TSettings = class(TPersistent) для контейнера
    Каждая информация для сериализации в опубликованном свойстве
    Список объектов TCollection и Тип TCollectionItem

    Компонент TJvAppXMLFileStorage для сохранения всего в одной строке:


    JvAppXMLFileStorage.WritePersistent(...);


НО, теперь я использую TObjectList как свойства класса TSettings. Поэтому я бросаю TCollection/TCollectionItem в пользу Generics...

При его сериализации нет списка элементов... Я думаю, это потому, что TObjectList не из TPersistent.


Как я могу сериализовать мой TObjectList < > с помощью TJvAppXMLFileStorage?

спросил(а) 2012-09-17T18:01:00+04:00 7 лет, 5 месяцев назад
1
Решение
62

Я успешно сериализую свой общий список с несколькими строками кода, вызывая JvAppXMLFileStorage.WriteList.


Во-первых, вот как я сериализовал список. Метод WriteGenericsObjectListItem<TMyClass> подробно описан ниже.


JvAppXMLFileStorage.WriteList('mylist',TObject(MyGenericList), MyGenericList.Count, WriteGenericsObjectListItem<TMyClass>);

Затем мне просто нужно определить , как сериализовать каждый элемент общего списка. Для этого я создал общий метод:

procedure TMySerializer.WriteGenericsObjectListItem<T>(Sender: TJvCustomAppStorage;
const Path: string; const List: TObject; const Index: Integer; const ItemName: string);
begin
if(List is TObjectList<T>) then
if Assigned(TObjectList<T>(List)[Index]) then
Sender.WritePersistent(Sender.ConcatPaths([Path, Sender.ItemNameIndexPath (ItemName, Index)]), TPersistent(TObjectList<T>(List)[Index]));
end;

Что это!

Я не изменяю код JCL/JVCL, только добавляю их в свою программу.

Я думаю, что я отправлю патч команде JCL/JVCL, чтобы добавить совместимость со всеми контейнерами Generics.


Надеюсь, это поможет вам!

ответил(а) 2012-09-21T10:29:00+04:00 7 лет, 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема