Erorr serializing TObjectList in TROXMLSerializer

Hi,

WHen I try to serialize a TObjectList with a TROXMLSerializer I get the error ‘This name can not contain the < character’.

How can I do this?

Thanks,

Hi,

can you show code snippet how to you do this, pls?

simple testcase will be appreciated too

Hi,

See attached.

Project3.zip (53.9 KB)

Hi,

you can’t use TMYList.ClassName as node name/tag because it has < & > in it’s value: TObjectList<Unit2.TMyObject>.

workaround: you should replace < and > with underscore (_) manually

Actually I also have nested collections the same way. How would I handle that? Changing the node name wont do that.

Hi,

you can check this case:

code
unit Unit2;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, uROXMLIntf, uROXMLSerializer,
  Generics.Collections, uROTypes, uROArray;

type
  TMyObject = class(TROComplexType)
  private
    fName: String;
  published
    property Name: String read fName write fName;
  end;

  TMyList = TROArray<TMyObject>;

  TForm2 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    FObjects: TMyList;
    function QuoteName(Value: string): string;
  public
    { Public declarations }
    procedure SaveXML;
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.Button1Click(Sender: TObject);
begin
  SaveXML;
end;

procedure TForm2.FormCreate(Sender: TObject);
var
  MyObject: TMyObject;
begin
  FObjects := TMyList.Create();

  MyObject := TMyObject.Create;
  MyObject.Name := 'Object1';

  FObjects.Add(MyObject);

  MyObject := TMyObject.Create;
  MyObject.Name := 'Object 2';

  FObjects.Add(MyObject);

  MyObject := TMyObject.Create;
  MyObject.Name := 'Object 3';

  FObjects.Add(MyObject);


end;

function TForm2.QuoteName(Value: string): string;
begin
  Result:= StringReplace(Value,'<','_',[rfReplaceAll]);
  Result:= StringReplace(Result,'>','_',[rfReplaceAll]);
end;

procedure TForm2.SaveXML;
var
  doc1:IXMLDocument;
  lxml:TROXMLSerializer;
  s: tStream;
begin

  doc1  :=  NewROXmlDocument;
  doc1.New(QuoteName(TMYList.ClassName));
  lxml  := TROXMLSerializer.Create(pointer(doc1.DocumentNode));

  try
    lxml.Write(QuoteName(TMyList.ClassName), TMyList.ClassInfo, FObjects);
  finally
    lxml.Free;
  end;

  s:=TMemoryStream.Create;
  try
    doc1.SaveToStream(s);
    s.Position := 0;
    memo1.Lines.LoadFromStream(s);
  finally
    s.Free;
  end;

end;

end.