Correcto, las clases del tipo TRemotable (usadas en Delphi para SOAP WebServices) no pueden medirse directamente en bytes como lo harías con un array o una estructura común. Esto se debe a que:
TRemotable hereda de TPersistent, y puede tener propiedades complejas, referencias, objetos anidados, etc.
No tiene una representación fija en memoria como un record, porque sus propiedades pueden estar implementadas por métodos get/set.
Algunas propiedades pueden ser dinámicas, opcionales o contener listas de objetos.
¿Qué hacer si quieres conocer el “tamaño” real de una instancia de TRemotable?
La mejor forma es serializar el objeto y medir el resultado, por ejemplo, en XML (formato que SOAP usa).
Ejemplo: medir el tamaño en bytes serializando con TSoapSerializer
Código Delphi
[-]
uses Soap.InvokeRegistry, Soap.SOAPDomConv, Soap.OPToSOAPDomConv, Soap.SOAPAttachIntf;
function GetRemotableSize(RemotableObj: TRemotable): Integer;
var
Serializer: ISoapSerializer;
BufferStream: TMemoryStream;
Converter: TOPToSoapDomConvert;
begin
BufferStream := TMemoryStream.Create;
try
Serializer := TSoapSerializer.Create(BufferStream);
Converter := TOPToSoapDomConvert.Create(nil);
Converter.ObjectToSoap(RemotableObj, nil, Serializer, '', '');
Result := BufferStream.Size;
finally
BufferStream.Free;
Converter.Free;
end;
end;
¿Qué hace esto?
Usa TSoapSerializer y TOPToSoapDomConvert para serializar el objeto TRemotable a XML.
Escribe esa serialización a un TMemoryStream.
Devuelve el tamaño del stream como tamaño aproximado del objeto.
Cómo usarlo:
Código Delphi
[-]
var
NifEnt: VNifV2Ent;
size: Integer;
begin
NifEnt := Consulta_NIF;
size := GetRemotableSize(NifEnt);
ShowMessage('Tamaño estimado: ' + IntToStr(size) + ' bytes');
Consideraciones
El tamaño obtenido es el tamaño de la representación serializada, no de la estructura en RAM.
Este método sigue siendo válido si el objeto contiene otros TRemotable anidados.