![]() |
Klassen in Streams speichern und wiederherstellen
ich habe mehrere Klassen die voneinander abgeleitet sind und immer zusätzliche Daten enthalten.
die erste Klasse (TItem) ist abgeleitet von TPersistent und wird in funktionen verwendet, um einen gemeinsamen nenner bei der datenanylse (in den klassen) zu erhalten. ich habe diese verschiedenen klassen in eine TList gespeichert, und speichere sie in einen stream indem ich einfach den Pointer in die erste Klasse TItem typecaste, und die virtuelle methode Store, zum speichern der Daten aufrufe. dann werde ja die überschriebenen methoden store der gespeicherten Klassen (alle sind ja von TItem abgeleitet) aufgerufen. so nu sollen alle klassen wieder geladen werden. aber um alle klassen wiederherzustellen muss ich doch genau die klassen wieder laden, die gespeichert wurden. aber woher weiß ich welcher klassentype geschrieben wurde? um eine klasse zu laden wird ja zuersteinmal Create mit dem KlassenTyp aufgerufen, und dann sollte Load aufgerufen werden, um die eigenschaften zu belegen. ich könnte ja TItem.Create verwenden, aber dann werden ja bei Load nur die Daten geladen, die in TItem.Load definiert wurden. Wenn nun eine Klasse abgeleitet von TItem mehr Daten geschrieben hat (mit eigenen Store und inherited Store), aber dann weniger gelesen werden, bleiben noch einige übrig, die beim nächsten Lesen zur Verwirrung führen.
Code:
ich könnte natürlich den klassentyp auch speichern :
readfromstream...
var List : TList; anitem : TItem; begin for i := 1 to count do begin anItem := TItem.Create; // <--- was ist wenn die gespeicherte klasse vom Typ TSubItem ist? anItem.Load(Stream); // List.Add(anitem); end; z.b. ClassName oder ähnliches aber müsste dann beim laden ja unterscheiden:
Code:
aber bei mehreren zig Klassen ist dass wirklich umständlich.
if loadedclassname = 'TSubItem' then
anItem := TItem(TSubItem.Create); am liebsten möchte ich den code auch unter freepascal ausführen, was für mich heißt, dass ich nur wenige VCL Klassen verwenden kann. THX |
Du kannst die Objekte auch direkt als TItem casten, wenn die Klasse bereits über die nötigen Methodenbezeichner "informiert" ist.
...:cat:.. |
was meinst du?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:26 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz