WriteComponent ReadComponent w wersji XML (albo Json)

0

Jak zapisywać obiekty dziedziczące po TPersistent w innym formacie niż to robi WriteComponent i ReadComponent ?
Szukam rozwiązania dla Delphi 2010

WriteComponent nie jest zły ale ma kilka wad:

  • binarny format cieżko porównać róznice miedzy kolejnymi wersjami
  • jak obiekt zapisany ma inna budowę to nie można wczytać do obiektu (np. nowa wersja API i zmodyfikowane niektóre pola )

Na razie eksperymentuje z
https://robstechcorner.blogspot.com/2009/10/xml-serialization-basic-usage.html

Nie chciał bym wymyślać koła na nowo

0
Adamek Adam napisał(a):

Jak zapisywać obiekty dziedziczące po TPersistent w innym formacie niż to robi WriteComponent i ReadComponent ?

Jakie obiekty?
I do czego to ma służyć?

Szukam rozwiązania dla Delphi 2010

WriteComponent nie jest zły ale ma kilka wad:

  • binarny format cieżko porównać róznice miedzy kolejnymi wersjami
  • jak obiekt zapisany ma inna budowę to nie można wczytać do obiektu (np. nowa wersja API i zmodyfikowane niektóre pola )

WriteComponent i ReadComponent służą trochę do innych celów, a słowem klucz jest tu Component.

OmniXML robił to poprawnie i tak jak byś chciał.
A było to ponad 10 lat temu...
A tu jest "lepszy" klon:
http://www.kluug.net/omnixml.php

A tu oryginał:
https://github.com/mremec/omnixml

Na razie eksperymentuje z
https://robstechcorner.blogspot.com/2009/10/xml-serialization-basic-usage.html

Znam to, ale to projekt który powstał w celu zabawy z nowym RTTI.
Do serializacji sensu stricte to się nie nadaje, bo zwyczajnie jest za słabe.
Zbyt proste.
Ale do prezentacji możliwości nowego RTTI wydawał się idealny :)

Nie chciał bym wymyślać koła na nowo

To najpierw opisz co chcesz osiągnąć.

Ja bardzo szeroko stosuję serializację, ale można powiedzieć że to jest zapis i odczyt sany obiektu.
Tylko tyle i aż tyle.

Jednym z najlepszych bibliotek jakie znam do Delphi jest SvSerializer:
https://bitbucket.org/soundvibe/delphi-oop/src/master/

Rzuć okiem na sekcję Persistance.
Ma naprawdę spore możliwości i prawdopodobnie daje Ci 200% tego co potrzebujesz.

Innym rozwiązaniem jest komercyjne biblioteka OXml:
http://www.kluug.net/oxml.php

Bardzo szybka i całkiem potężna.

0

Użytkownicy wydziwiają :) I komplikują życie
Ustawienia programu staja się coraz bardziej zagmatwane i dostrzegam konieczność zapisywania i wczytywania coraz bardziej karkołomnych struktur
Chciałbym zapisać wczytać cale obiekty (tablice obiektow), kolekcje itp...

Do tej pory wystarczyło mi zwykłe INI w skrajnym przypadku używałem TJvCustomAppStorage https://wiki.delphi-jedi.org/wiki/JVCL_Help:TJvCustomAppStorage
Interfejs TJvCustomAppStorage jak plik INI ;) dane zapisywałem sobie w SqLIte

WriteComponent ReadComponent były pierwszym krokiem na drodze :)

Dziękuje za materiały !

Rzeczywiście ten przykład który podałem dość szybko "wymiękł" bo już z kolekcjami sobie nie poradził

0
Adamek Adam napisał(a):

Użytkownicy wydziwiają :) I komplikują życie
Ustawienia programu staja się coraz bardziej zagmatwane i dostrzegam konieczność zapisywania i wczytywania coraz bardziej karkołomnych struktur
Chciałbym zapisać wczytać cale obiekty (tablice obiektow), kolekcje itp...

I właśnie dlatego od lat używam SvSerializera, który radzi sobie z naprawdę skomplikowanymi strukturami danych.
Obiekt zawierający generyczną listę innych obiektów lub rekordów?
Żaden problem.

Omni XML też by sobie poradził, ale...
Nie działa z rekordami, a lista obiektów jest wspierana tylko i wyłącznie przez kolekcje.
Co z kolei jest ciut upierdliwe przy implementacji.

0

Jedyny większy problem jaki widzę to że trzeba pozbyć się TCollection i użyć zamiast np. TObjectList<Tcostamcostam>;
do przechowywania listy obiektów "Tcostamcostam"

1 użytkowników online, w tym zalogowanych: 0, gości: 1