You are not logged in.
Pages: 1
That did the job. Thank you very much 
On a side note, adding dummy string to TRange was one of the first things I have tried. ObjectToJson still wouldn't parse it. Curious about ab's answer though.
I have one last question, as I ran into a different issue. I thought about using a TStringList field. Is it supported out of the box?
  TEnemy = class(TPersistent)
  private
    fEnabled: Boolean;
    fName: string;
    fList: TStringList;
  public
    constructor Create;
    destructor Destroy; override;
  published
    property Enabled: Boolean read fEnabled write fEnabled;
    property Name: string read fName write fName;
    property List: TStringList read fList write fList;
  end;
  
destructor TEnemy.Destroy;
begin
   fList.Free;
end;
constructor TEnemy.Create;
begin
   fList := TStringList.Create;
end;When using it like this:
var
 en: TEnemy;
begin
 en := TEnemy.Create;
 en.List.Add('test');
 ol := TObjectList.Create;
 ol.Add(en);
 ObjectToJsonFile(ol, 'test.json');
 ol.Clear;
 JsonFileToObject('test.json', ol, TEnemy);
 ShowMessage(IntToStr(ol.count));
 ol.Free;JsonFileToObject fails, although the object list is serialized correctly by ObjectToJsonFile. What I am missing here?
Thanks for all your time.
As a workaround, you may define the published property as a variant (storing the information as a TDocVariant object), with a public TOffense record property, and getter/setter methods.
  TRange = record
    Min, Max: Integer;
  end;
  TOffense = record
    Damage, AttackSpeed: TRange;
  end;
  TEnemy = class(TPersistent)
  private
    fEnabled: Boolean;
    fName: string; 
    function GetOffense: Variant;
    procedure SetOffense(Value: Variant);
  public
    _Offense: TOffense;
  published
    property Enabled: Boolean read fEnabled write fEnabled;
    property Name: string read fName write fName;
    property Offense: Variant read GetOffense write SetOffense;
  end;
  
  
function TEnemy.GetOffense: Variant;
begin
   Result := _Obj(['Damage',_Obj(['Min',_Offense.Damage.Min,'Max',_Offense.Damage.Min]),
		   'AttackSpeed',_Obj(['Min',_Offense.AttackSpeed.Min,'Max',_Offense.AttackSpeed.Max]]);
end;
  
procedure TEnemy.SetOffense(Value: Variant);
begin
   with _Json(Value) do
   begin
     _Offense.Damage.Min := Damage.Min;
     ...
   end;
end;Did you mean something like this?
I have read that and already tried it, see my first post. It doesn't work, because records doesn't have type info (at least in Delphi 7) as ab said. 
I need to serialize TObjectList of objects of TEnemy class, which have a record property. Is there any way to do this, other than exposing each record field as a property or upgrading to Delphi 2010?
Thanks for response. I cannot use record as I'm storing the objects in TObjectList. I changed it to
TRange = record
    Min, Max: Integer;
  end;
  TOffense = record
    Damage, AttackSpeed: TRange;
  end;
  TEnemy = class(TPersistent)
  private
    fEnabled: Boolean;
    fName: string;
    fOffense: TOffense;
  published
    property Enabled: Boolean read fEnabled write fEnabled;
    property Name: string read fName write fName;
    property DamageMin: Integer read fOffense.Damage.Min;
    property DamageMax: Integer read fOffense.Damage.Max;
    property AttackSpeedMin: Integer read fOffense.AttackSpeed.Min;
    property AttackSpeedMax: Integer read fOffense.AttackSpeed.Max;
  end;and it works.. but seems not elegant to me. What is the recommended way to serialize TObjectList of objects with record/custom type fields?
 TRange = record
    Min, Max: Integer;
  end;
  TOffense = record
    Damage, AttackSpeed: TRange;
  end;
  TEnemy = class(TPersistent)
  private
    fEnabled: Boolean;
    fName: string;
    fOffense: TOffense;
  published
    property Enabled: Boolean read fEnabled write fEnabled;
    property Name: string read fName write fName;
    property Offense: TOffense read fOffense;
  end
 Hello.
Can anyone help me to serialize objects of above class?
ObjectToJson skips the Offense property...
I tried to
const
__TRange = 'Min,Max Integer';
__TOffense  = Damage,AttackSpeed TRange';
TTextWriter.RegisterCustomJSONSerializerFromText(TypeInfo(TRange), __TRange);
TTextWriter.RegisterCustomJSONSerializerFromText(TypeInfo(TOffense), __TOffense);
 Compilation fails saying that TRange and TOffense have no type info. 
I'm using Delphi 7. Is there really no easy way to serialize such a simple object?
Pages: 1