Results 1 to 12 of 12

Thread: Serializen in Delphi 2007

  1. #1

    Serializen in Delphi 2007

    Hallo hallo,

    Voor de applicatie die ik aan het ombouwen ben, moet ik objecten persistent maken. Ik heb al een poging gedaan met de JvAppXMLFileStorage en dit lukt bij relatief eenvoudige klassen. Wordt het iets complexer bijvoorbeeld objecten met TObjectList properties, dan wordt het al vrij lastig/onmogelijk om dit met de JVAppXMLFileStorage te serializen, omdat properties published moeten zijn en omdat de klas moet erven van TPersistent om dit werkend te krijgen.

    Iemand een suggestie hoe ik dit in D2007 toch voor elkaar krijg?

    Bij voorbaat dank!

  2. #2
    Je zou in je klasse de procedure DefineProperties kunnen overschrijven. Daar een binary property definieren voor je non-published TObjectList property. De write methode van de property kan dan elk object in je object list naar de writer wegschrijven.

  3. #3
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,482
    Ik heb ooit iets dergelijks geschreven met gespecialiseerde afgeleiden van TObject en TObjectList.
    De TObject-afgeleiden konden zichtzelf opslaan als XML en TObjectList kon alle objecten aflopen en indien het zo'n TObject was, dan vertelde hij om zich weg te schrijven naar de opgegeven XML.
    Dit alles via de good old RTTI (dus geen extended want dat zit niet in D2007), dus alle properties die je op wilt kunnen slaan moeten wel published zijn.

    Ik zal, wanneer ik tijd kan vinden, eens kijken of ik een eenvoudige proof of concept in elkaar kan brouwen (indien gewenst).
    Last edited by VideoRipper; 23-Jul-20 at 13:07. Reason: Typo's
    TMemoryLeak.Create(Nil);

  4. #4
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,180
    Of een TFields achtige structuur. Een class heeft een array met veldbeschrijvingen + array met variants voor de veld waarden.

  5. #5
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,482
    Quote Originally Posted by marcov View Post
    Of een TFields achtige structuur.
    I'm intrigued, leg eens uit.
    TMemoryLeak.Create(Nil);

  6. #6
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,180
    Het idee is dat je _generieke_ streaming code wil schrijven. Maar je hebt geen attributes/rtti.

    Maar rtti zijn simpelweg wat beschrijvende tabelletjes. Dus wat doe je ? Je voegt per veld een record in een array (tabel) in met allerlei veldbeschrijvende properties in de constructor (a la defineproperties) Voor de waardes gebruik je een array of variant. Soms wordt er ook nog een array van tobject bijgevoegd.

    De streaming code loopt over de beschrijvingen heen, en als het type daar simpel is, dan zit het in de variant, anders in de tobject. Evt zit daar ook het XML tag in. Destructor loopt over tabel heen en freed indien nodig. .Clear loopt over tabel heen en zet default waarden terug e.d.

    Het leuke is dat je een combinatie van rechttoe rechtaan objecten kan maken, en objecten waar je wat extra logica aan toevoegd.

    Ik gebruik dat nog steeds voor mijn configuratie files icm Lazarus XML unit XMLconfig.

    Maar goed die veldbeschrijving array moet je nog steeds manueel creeren in de constructor natuurlijk......

    Ik doe het manueel, bij een vorige werkgever werden deze deels uit queries/tabel info gegenereerd.

  7. #7
    Ik mis eigenlijk wat context. Afhankelijk van of je zomaar elk object wilt kunnen streamen, of alleen een specifiek setje, kan je misschien ook bepalen of het handig is om een generieke streamer te schrijven, iets in de objecten zelf toe te voegen, of losse classes te maken die speciek gemaakt zijn voor het streamen van andere classes. E.e.a. hangt natuurlijk ook af van de objecten die je wilt streamen. Als dat standaard classes uit de VCL zijn, of classes uit een 3rd party component library, dan kan je ze misschien helemaal niet zomaar aanpassen. Een externe class is dan wel het makkelijkst.

    Je zou dan (vooruitlopend op de antwoorden op bovenstaande vragen), wel een generieke serializer kunnen maken, maar daarin writers registreren voor het serializen van specifieke types.

    Overigens weet ik niet of er vooruitzicht is dat je naar een nieuwere versie gaat, maar de RTTI, is na 2007 volgens mij nog flink uitgebreid, en je kan er tegenwoordig zo'n beetje elk detail van je class mee benaderen, inclusief private fields (dat is waar de JSON serializers in latere versies ook gebruik van maken).
    1+1=b

  8. #8
    Het betreft hier eigen klassen dus ik heb redelijk wat vrijheid om bijvoorbeeld TPersistent als voorouder te gebruiken en de properties published te maken. Het is de bedoeling om het generiek op te zetten. De uitdaging is eigenlijk om (geneste) objectlist weg te schrijven en weer te lezen.

    Helaas is dit project nog in 2007 Met kbmmw had ik dit in één regel + wat attributen bij de classes kunnen oplossen.

  9. #9
    Niet mogelijk om te upgraden? Zeker als je ook andere projecten in een nieuwere versie doet. Tenslotte is die versie meer dan 13 jaar oud..
    1+1=b

  10. #10
    Persoonlijk vind ik het onbegrijpelijk dat er niet ge-upgrade wordt, de tijd die je eraan kwijt bent verdien je volgens mij heel makkelijk terug. Nu moet ik met enige regelmaat gaan lopen rotzooien met bugs in 3th party componenten die al oplost zijn in nieuwere versies, maar die geen D2007 meer ondersteunen. Ook zijn er steeds minder componentboeren die D2007 nog ondersteunen en dat worden er waarschijnlijk steeds minder. Misschien is het anders als je gewend bent om in 2007 te werken, omdat je dan niet beter weet. Ik vind situaties zoals met het serialize probleem ontzettend frustrerend omdat ik het in kbmmw + recente Delphi versie het in een kwartier had kunnen maken en nu al een paar dagen loop te rotzooien met een weinig bevredigend resultaat.

  11. #11
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,482
    Been there, done that...

    Je hebt dit project niet afgelopen januari/februari overgenomen toevallig?
    TMemoryLeak.Create(Nil);

  12. #12
    Nee, toevallig niet

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •