Tôi đang tuần tự hóa và deserializing một đối tượng (TComponent hậu duệ) bằng cách sử dụng ví dụ trong phần ComponentToString trong tệp trợ giúp Delphi. Điều này là để tôi có thể lưu trữ đối tượng trong một trường VARCHAR trong cơ sở dữ liệu.Tôi có thể tạo một hàm tạo để deserializes một phiên bản chuỗi của đối tượng của tôi không?
Khi tôi cần khởi tạo phiên bản mới của lớp học từ một chuỗi được lưu trữ trong cơ sở dữ liệu, tôi có thể thực hiện điều đó bằng cách sử dụng hàm tạo của biểu mẫu CreateFromString(AOwner: TComponent; AData: String)
không? Hoặc tôi có phải sử dụng một phương pháp không lớp trả về một thể hiện của lớp thành phần của tôi?
Nếu tôi có thể sử dụng phiên bản hàm tạo, làm cách nào để "ánh xạ" giá trị trả về của ReadComponent thành "tự" được tạo bởi hàm tạo?
Dưới đây là ví dụ deserialization từ tập tin giúp đỡ:
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;
Có thể có một lỗi nhỏ trong quá trình triển khai của bạn không? Tôi nghĩ rằng nó nên là 'Tạo (nil)'; không được thừa hưởng Create (nil); Với "kế thừa", bạn bỏ lỡ việc tạo bất kỳ lưu trữ trường và thuộc tính nào được giới thiệu bởi TLarryComponent. –
Bạn nói đúng. Tôi đã nghĩ rằng 'ReadComponent' sẽ chăm sóc nó, nhưng tôi nhận ra bây giờ không có cách nào nó có thể. –
Bây giờ làm việc hoàn hảo và cung cấp một giải pháp thanh lịch cho vấn đề của tôi. –