2010-05-03 5 views
3

Я пытаюсь написать сериализатор объектов/записей с Delphi 2010 и задаюсь вопросом, есть ли способ обнаружить, если запись является вариантом записи. Например. запись TRect, как это определено в Types.pas:Rtti for Variant Records

TRect = record 
case Integer of 
    0: (Left, Top, Right, Bottom: Longint); 
    1: (TopLeft, BottomRight: TPoint); 
end; 

Как мой сериализатору должен работать рекурсивно на моих структур данных, это будет спуск на TPoint записи и генерировать избыточную информацию в моем сериализованном файле. Есть ли способ избежать этого, получив подробную информацию о записи?

+0

что вы пытались до сих пор? –

ответ

1

Одним из решений может быть следующим:

procedure SerializeRecord (RttiRecord : TRttiRecord) 

var 
    AField : TRttiField; 
    Offset : Integer; 

begin 
Offset := 0; 
for AField in RttiRecord.Fields do 
    begin 
    if AField.Offset < Offset then Exit; 
    Offset := AField.Offset; //store last offset 
    SerializeField (AField); 
    end; 
end; 

Но это решение не является правильным решением для всех случаев. Он работает только для сериализации, если разные варианты содержат одну и ту же информацию и одни и те же типы. Если у вас есть что-то вроде следующего (из wikipedia.org):

type 
    TVarRec = packed record 
    case Byte of 
    0: (FByte: Byte; 
     FDouble: Double); 
    1: (FStr: ShortString); 
    end; 

ли вы сериализации

FByte=6 
FDouble=1.81630607010916E-0310 

или было бы лучше, чтобы сериализовать

FStr=Hello! 

Да, конечно, это также будет одинаково для компьютера, но не для файла, который должен быть доступен для чтения или даже редактироваться для людей.

Так что, я думаю, единственный способ решить проблему - использовать Атрибут, чтобы определить, какой вариант следует использовать для сериализации.

+0

Кстати: размеры вариантных частей записи могут быть разными! В текущем решении можно было бы потерять информацию. Таким образом, необходимо проверить, что накопленные размеры полей соответствуют размеру записи. –

 Смежные вопросы

  • Нет связанных вопросов^_^