Serializacja obiektów między innymi do JSON.

0

Cześć !

Chce serializować sobie obiekty do np. json. Generalnie stworzyłem sobie funkcję która ma mi zwracać obiekt TJSONObject. Pytanie jak ma wyglądać ta funkcja ? Mogę utworzyć obiekt json i dodawać kolejne atrybuty i subobiekty. Pytanie jak to robić ? Mogę to rzeźbić ręcznie, ale w przypadku jak dodam kolejne property, czy jakąś strukturę składową, będę musiał dodawać kolejny wpis o dodanie jakiegoś atrybutu. Nie można jakoś tego automatyzować? Np. chodzenie po składowych klasy i zapisywanie ich wartości w pętli z kluczem - np. nazwą składowej ?? Proszę o pomoc jak takie rzeczy się robi. Z góry dzięki !

0

Poczynając od pierwszych Delphi da się wylistować w pętle wszystkie publiszed właściwości ...

0

Możesz coś więcej napisać ? Nie mogę znaleźć w sieci tutoriala. Btw, property published jaka ma widoczność ? Co z polami internal, które nie mają property ?

1
  1. Po 14 minutach stwierdziłeś że nie możesz znaleźć ... pozostawiam bez komentarza (hasła: Delphi TPersistent GetPropertyValue SetPropertyValue)
  2. Published to "bardziej niż publiczne"
  3. Do pól internal dorób published właściwość.
0

Dzięki za pomocne hasła. Generalnie trudno coś na ten temat znaleźć i nie mam zamiaru tutaj polemizować, jednak jak już do czegoś się dokopałem, to chciałbym czas poświęcić na dalszą rozmowę, nt. istoty problemu.
Znalazłem, rykoszetem od TPresistent unit Typeinfo w fcl rtl, który ma metodę GetPropList, która faktycznie zwraca mi listę property Published. Teraz twój pomysł nt. pól internal - jeżeli dorobię property to właściwie pola te przestaną być private. Nawet jak zrobię tylko gettery, bez setterów, to i tak każdy będzie mógł sobie oglądać te property i ich wartości... Ja chciałem osiągnąć sytuację, że użytkownik klasy dostane zserializowany obiekt w postaci JSON, więc nie powinien mieć on świadomości, czy ja zrobiłem to z 2, 3 czy 4 property i jaką miały wartość. Równie dobrze mogłem zakodować te wartości w moim serializatorze i udostępnić plik JSON, który nie odzwierciedla struktury obiekty 1:1.
Zatem czy jest możliwość takiego iterowania po polach, żeby zobaczyć, również pola private ? Innym rozwiązaniem jakie widzę, to skryptem after compile generować dodatkowe informacje wykorzystywane w runtime ( starczy sama lista pól i ich typy), jednak sądzę, że to armata na muche i można to zrobić inaczej.

0

Prywatne pola dla tego są prywatne aby nie byli dostępne również z poziomu serializatora.
Hasło: - "I rybka i pipka." - rzadko jest realizowalne.
Więc albo do każdej klasy dodajesz metody ReadFromFormatSerializacjiNpStream WriteToFormatSerializacjiNpStream i dla każdej klasy mozolnie te metody klepiesz albo ograniczasz się do właściwości publiszed.

0

Cóż, szkoda, że trzeba będzie klepać to ręcznie. Zawsze można spreparować takie coś o co mi chodzi zamiast składując zwykłe pola, mieć kolekcje, struktur typu record, zawierające variant oraz string gdzie jest name, wtedy mamy tak naprawdę jedno pole prywatne w którym ukrywam resztę pól prywatnych, mogę bezpiecznie po tym iterować i to bez rtti i publikowania property. Co o tym myślicie ?

1

Ja się na FPC nie wyznaję, ale gotowca (w źródłach FPC SIC!) znalazłem w 30s.
https://github.com/graemeg/freepascal/blob/master/packages/fcl-json/src/fpjsonrtti.pp

I jeden drobny komentarz; jak czytam co poniektóre wypowiedzi, to mam wrażenie że dla niektórych czas zatrzymał się jakieś 15 lat temu.
Można i tak...

0

Dzięki panowie. Dużo pomogliscie i w zasadzie mój problem rozwiązany.

@wloochacz dlaczego 15 lat? Bo odkrywam coś, na nowo czy używam niszowej technologii??

0

Ok. Przyznaję, że nie posiadam, dużej wiedzy nt. nowoczesnego Delphi. Może podzielicie się wiedzą, w jaki sposób robi się to w nowym Delphi zatem, i ew. czy mogę to wykonać w free pascalu ?? Z góry dzięki za pomoc, i proszę o wyrozumiałość.

0

Jak musisz to wykonać sam (bo tak zrozumiałem) to podałem ci prosty pomysł, będzie działać.
Jak nie musisz sam to @wloochacz podał ci na tace gotowca.
Jak chcesz wykładów na temat technologii najnowszego Delphi to zapomnij na razie o tym - na 100% nie zrozumiesz, ponieważ znacznie prostszą koncepcją jest znalezienie tego tematu w google, zaś tej prostszej koncepcji wciąż nie opanowałeś.

0

Nie uważam, że dobrze mnie oceniasz. Nie muszę tego sam robić, po prostu sobie hobbystycznie piszę, i byłem przekonany, że to rozwiązanie jest prawidłowym. Nie wiem, po czym sądzisz, że czegoś nie zrozumie, jednak uważam, że odpowiadanie w ten sposób na pytanie nie jest odpowiednie . Twoim tokiem myślenia, jeżeli ktoś ma braki z jakiejś dziedziny, to nie powinien ich uzupełniać, bo i tak nie zrozumie, to jak tu się rozwijać? Dobrze, kończę dyskusję, bo dalej nie ma chyba sensu, bo i już nic nie wniesie. Dziękuję bardzo Panowie, za pomoc. Przeanalizuje materiały i kody przez was podane. Naprawdę są pomocne, i wierzę, że z tą pomocą uda mi się ukończyć, mój jak na mnie ambitny projekcik. Pozdrawiam.

0
prixans napisał(a):

@wloochacz dlaczego 15 lat? Bo odkrywam coś, na nowo czy używam niszowej technologii??

Bo robicie coś, za pomocą technik sprzed dekady albo i dwóch.
Mam wrażenie, ze co poniektórzy przestali się uczyć po "hello world" napisanego na 100 różnych sposobów, ale de-facto podobnie...

Chcesz fajną bibliotekę dla refleksji? Proszę:
https://code.google.com/p/delphi-oop/wiki/SvSerializer

Ale z FPC to nie zadziała...

0

Dzięki za info. Niestety nie chce wydawać worka kasy, na delphi, skoro piszę hobbystycznie, a w pracy to firma załatwia nam IDE ( C++ Builder... ). Rozumiem, niemniej z Twojej wypowiedzi, że sugerujesz, że fpc, lekko przestarzałe ma mechanizmy i biblioteki. Czy tak jest ogólnie, czy tylko w tym przypadku, mojego problemu ? Generalnie pisze, w fp, żeby oderwać się, od c++, c# i sql, ale też bym nie chciał marnować czasu na zupełnie bezużyteczne doświadczenie. Analizowałem projekty powstające w fpc i myślałem, że fpc i lazarus to całkiem nowoczesne, i użyteczne języki i narzędzia ( chociaż c# czy scala to z tego nie jest). Nie chce wstrzynać dyskusji na tle fpc vs reszta swiata, tylko fpc vs współczesne zapotrzebowanie, i ograniczenia, czy tylko w tym problemie, czy innych. Teraz widzę, że ta biblioteka nie zadziała pod fpc, zastanawiam się ile jest takich różnic.

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