Sto serializzando e deserializzando un oggetto (discendente TComponent) utilizzando l'esempio nella sezione ComponentToString nel file della guida di Delphi. Questo è così posso memorizzare l'oggetto in un campo VARCHAR nel database.Posso creare un costruttore che deserializza una versione di stringa del mio oggetto?
Quando ho bisogno di istanziare una nuova istanza della mia classe da una stringa memorizzata nel database, posso farlo utilizzando un costruttore del modulo CreateFromString(AOwner: TComponent; AData: String)
? O devo usare un metodo non di classe che restituisce un'istanza della mia classe componente?
Se posso utilizzare la versione del costruttore, come "mappare" il valore restituito di ReadComponent al "sé" che viene creato dal costruttore?
Ecco l'esempio deserializzazione dal file di aiuto:
function StringToComponentProc(Value: string): TComponent;
var
StrStream:TStringStream;
BinStream: TMemoryStream;
begin
StrStream := TStringStream.Create(Value);
try
BinStream := TMemoryStream.Create;
try
ObjectTextToBinary(StrStream, BinStream);
BinStream.Seek(0, soFromBeginning);
Result:= BinStream.ReadComponent(nil);
finally
BinStream.Free;
end;
finally
StrStream.Free;
end;
end;
È possibile che ci sia un piccolo bug nella tua implementazione? Penso che dovrebbe essere 'Create (nil)'; non 'inherited Create (nil);'. Con "ereditato" si perde la creazione di qualsiasi memoria di campo e proprietà introdotte da TLarryComponent. –
Hai ragione. Pensavo che "ReadComponent" si sarebbe occupato di questo, ma ora capisco che non c'è modo di farlo. –
Ora funziona perfettamente e fornisce una soluzione elegante al mio problema. –