В общем, да, вы можете заставить конструктор десериализовать строку и использовать эту информацию для инициализации нового экземпляра. Тривиальным примером этого может быть класс с одним полем Integer
. Передайте строку конструктору, вызовите конструктор StrToInt
и инициализируйте поле с результатом.
Но если единственная функция, которую вы используете для десериализации, это та, которая также создает экземпляр, вы не можете использовать это из конструктора, потому что тогда у вас будет два экземпляра, когда вы захотите только одну. Для конструктора нет никакого способа сказать: «Не бери в голову, не создавай экземпляр в конце концов. У меня уже есть другой».
Однако, это не та ситуация, в которой вы находитесь. Как вы должны знать, TStream.ReadComponent
позволяет вам создать экземпляр самостоятельно. Он создает экземпляр класса, только если вы еще не дали ему экземпляр для использования. Вы должны иметь возможность написать свой конструктор так:
constructor TLarryComponent.CreateFromString(const AData: string);
var
StrStream, BinStream: TStream;
begin
Create(nil);
StrStream := TStringStream.Create(AData);
try
BinStream := TMemoryStream.Create;
try
ObjectTextToBinary(StrStream, BinStream);
BinStream.Position := 0;
BinStream.ReadComponent(Self);
finally
BinStream.Free;
end;
finally
StrStream.Free;
end;
end;
Там мы передаем текущий объект, обозначенный Self
, ReadComponent
. Поток будет игнорировать имя класса, хранящееся в потоке, и предположит, что текущий объект имеет правильный класс.