├── .gitignore ├── JsonDataObjects.pas ├── PascalObjectSeralize.identcache ├── PascalObjectSeralize.stat ├── README.md ├── backup ├── fpc_seralizeadapter.pas ├── intf_seralizeadapter.pas └── pascalobject_seralize.pas ├── delphi_seralizeadapter.pas ├── delphi_test ├── PascalObjectSeralize.dpr ├── PascalObjectSeralize.dproj ├── PascalObjectSeralize.dproj.local ├── PascalObjectSeralize.identcache ├── PascalObjectSeralize.res ├── PascalObjectSeralize.skincfg ├── PascalObjectSeralize.stat ├── Testpascalobject_seralize.pas ├── frm_test.dfm ├── frm_test.pas ├── testPascalObjectSeralize.dpr ├── testPascalObjectSeralize.dproj ├── testPascalObjectSeralize.dproj.local ├── testPascalObjectSeralize.identcache ├── testPascalObjectSeralize.res ├── testPascalObjectSeralize.skincfg └── testPascalObjectSeralize.stat ├── fpc_seralizeadapter.pas ├── intf_seralizeadapter.pas ├── pascalobject_seralize.pas └── test ├── backup ├── frm_test.lfm ├── pascalobject_seralize_test.lpi ├── pascalobject_seralize_test.lpr ├── pascalobject_seralize_test.lps ├── test_pascalobjectseralize.pas └── testfpc_seralizeadapter_test.pas ├── frm_test.lfm ├── frm_test.pas ├── pascalobject_seralize_test.compiled ├── pascalobject_seralize_test.fpcunit.ini ├── pascalobject_seralize_test.ico ├── pascalobject_seralize_test.lpi ├── pascalobject_seralize_test.lpr ├── pascalobject_seralize_test.lps ├── pascalobject_seralize_test.res ├── test_pascalobjectseralize.pas ├── testcase1.pas ├── testdata ├── test.png ├── test.xml └── testCollection.xml └── testfpc_seralizeadapter_test.pas /.gitignore: -------------------------------------------------------------------------------- 1 | *.o 2 | *.ppu 3 | *.exe 4 | *.dbg 5 | *.or 6 | lib/ 7 | DEBUG/ 8 | RELEASE/ 9 | __history/ 10 | *.dcu 11 | *.json 12 | *.png 13 | *.xml 14 | *.bak 15 | __recovery/ 16 | -------------------------------------------------------------------------------- /PascalObjectSeralize.identcache: -------------------------------------------------------------------------------- 1 | 7E:\GitHub\PascalObjectSeralize\PascalObjectSeralize.dpr -------------------------------------------------------------------------------- /PascalObjectSeralize.stat: -------------------------------------------------------------------------------- 1 | [Stats] 2 | EditorSecs=1 3 | DesignerSecs=1 4 | InspectorSecs=1 5 | CompileSecs=1 6 | OtherSecs=1 7 | StartTime=2018/3/8 10:05:25 8 | RealKeys=0 9 | EffectiveKeys=0 10 | DebugSecs=1 11 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # PascalObjectSeralize 2 | Seralize a Object to xml or json file support lazarus Delphi 3 | -------------------------------------------------------------------------------- /backup/fpc_seralizeadapter.pas: -------------------------------------------------------------------------------- 1 | unit fpc_seralizeadapter; 2 | {$mode objfpc}{$H+} 3 | interface 4 | 5 | uses 6 | Classes, SysUtils, variants, 7 | fpjson, dbugintf,Laz_XMLRead, Laz2_DOM, Laz_XMLWrite, 8 | intf_seralizeadapter; 9 | type 10 | 11 | { TFPCXmlNode } 12 | TFPCXmlNode=class(TInterfacedObject,IDataNode) 13 | 14 | 15 | function GetAttributes(Name: string): string; 16 | function GetChildItem(Index:integer): IDataNode; 17 | function GetNodeName: string; 18 | function GetValue: variant; 19 | procedure SetAttributes(Name: string; AValue: string); 20 | procedure SetNodeName(AValue: string); 21 | procedure SetValue(AValue: variant); 22 | function AddChild():IDataNode; 23 | function ChildCount:integer; 24 | procedure SetData(AValue: string); 25 | function AddPropObj(const Name: string): IDataNode; 26 | function PropObjByName(const Name:string): IDataNode; 27 | function GetData: string; 28 | function GetDumpText:string; 29 | protected 30 | fDoc:TDOMDocument; 31 | fNode:TDOMNode; 32 | function BuilDataNode(const Node:TDOMNode):IDataNode; 33 | end; 34 | {TFPCJsonNode=class(TInterfacedObject,IDataNode) 35 | 36 | end;} 37 | 38 | 39 | { TFPCXmlAdapter } 40 | 41 | TFPCXmlAdapter=class(TInterfacedObject,IDataAdapter) 42 | 43 | 44 | 45 | function NewDoc:IDataNode; 46 | function GetRootNode:IDataNode; 47 | procedure LoadFromFile(const Filename:string); 48 | procedure SaveToFile(const FileName:string); 49 | function GetSeralzieString: string; 50 | private 51 | fDoc:TXMLDocument; 52 | public 53 | destructor Destroy;override; 54 | 55 | end; 56 | TFPCJsonNode=class(TInterfacedObject,IDataNode) 57 | function GetAttributes(Name: string): string; 58 | function GetChildItem(Index:integer): IDataNode; 59 | function GetNodeName: string; 60 | function GetValue: variant; 61 | procedure SetAttributes(Name: string; AValue: string); 62 | procedure SetNodeName(AValue: string); 63 | procedure SetValue(AValue: variant); 64 | function AddChild():IDataNode; 65 | function ChildCount:integer; 66 | procedure SetData(AValue: string); 67 | function GetData: string; 68 | function AddPropObj(const Name: string): IDataNode; 69 | function PropObjByName(const Name:string): IDataNode; 70 | function GetDumpText:string; 71 | protected 72 | fDoc:TJsonObject; 73 | fNode:TJSOnData; 74 | FParent:TJsonObject; 75 | function BuilDataNode(const Node:TJsonData):IDataNode; 76 | end; 77 | 78 | { TFPCJsonAdapter } 79 | 80 | TFPCJsonAdapter=class(TInterfacedObject,IDataAdapter) 81 | function NewDoc:IDataNode; 82 | function GetRootNode:IDataNode; 83 | procedure LoadFromFile(const Filename:string); 84 | procedure SaveToFile(const FileName:string); 85 | function GetSeralzieString: string; 86 | private 87 | fDoc:TJsonObject; 88 | public 89 | destructor Destroy;override; 90 | end; 91 | implementation 92 | 93 | { TFPCJsonNode } 94 | 95 | function TFPCJsonNode.GetAttributes(Name: string): string; 96 | begin 97 | if FNode is TJSonData then 98 | begin 99 | result :=(FNode as TJsonObject).Get(LowerCase(Name)); 100 | end else 101 | begin 102 | assert(false,'fnode is not a object'); 103 | end; 104 | end; 105 | 106 | function TFPCJsonNode.GetChildItem(Index: integer): IDataNode; 107 | var 108 | Item:TJsonObject; 109 | Count:integer; 110 | JObj:TJsonObject; 111 | Arr:TJSONArray; 112 | begin 113 | JObj :=FNode as TJsonObject; 114 | Arr :=JObj.Arrays['ITEMS']; 115 | Item :=Arr.Objects[Index]; 116 | result :=BuilDataNode(Item); 117 | end; 118 | 119 | function TFPCJsonNode.GetNodeName: string; 120 | var 121 | Index:integer; 122 | begin 123 | Index :=FParent.IndexOf(FNode); 124 | result :=FParent.Names[Index]; 125 | 126 | end; 127 | 128 | function TFPCJsonNode.GetValue: variant; 129 | begin 130 | result :=FNode.Value; 131 | end; 132 | 133 | procedure TFPCJsonNode.SetAttributes(Name: string; AValue: string); 134 | var 135 | JD:TJSOnData; 136 | Jobj:TJsonObject; 137 | begin 138 | if FNode is TJsonObject then 139 | begin 140 | JObj :=FNode as TJsonObject; 141 | JD :=Jobj.Find(LowerCase(Name)); 142 | if not Assigned(JD)then 143 | begin 144 | (FNode as TJsonObject).Add(LowerCase(Name),AValue); 145 | end else 146 | begin 147 | jd.AsString:=AValue; 148 | end; 149 | end; 150 | end; 151 | 152 | procedure TFPCJsonNode.SetNodeName(AValue: string); 153 | begin 154 | (FNode as TJsonObject).Find('name').Value :=AVAlue; 155 | end; 156 | 157 | procedure TFPCJsonNode.SetValue(AValue: variant); 158 | 159 | begin 160 | FNode.Value:=AValue; 161 | 162 | end; 163 | 164 | function TFPCJsonNode.AddChild(): IDataNode; 165 | var 166 | JObj:TJsonObject; 167 | Child:TJsonObject; 168 | JNode:TFPCJsonNode; 169 | JArr:TJSONArray; 170 | begin 171 | JObj :=FNode as TJsonObject; 172 | if not JObj.Find('ITEMS',JArr) then 173 | begin 174 | JArr :=TJSONArray.Create; 175 | JObj.Add('ITEMS',JArr); 176 | end; 177 | 178 | Child :=TJsonObject.Create(); 179 | JArr.Add(Child); 180 | result :=BuilDataNode(Child); 181 | end; 182 | 183 | function TFPCJsonNode.ChildCount: integer; 184 | var 185 | JObj:TJsonObject; 186 | Arr:TJSONArray; 187 | begin 188 | JObj :=fNode as TJsonObject; 189 | Arr :=Jobj.Arrays['ITEMS']; 190 | result :=Arr.Count; 191 | end; 192 | 193 | 194 | 195 | procedure TFPCJsonNode.SetData(AValue: string); 196 | begin 197 | (FNode as TJSonObject).Add('cdata',AValue); 198 | end; 199 | 200 | function TFPCJsonNode.GetData: string; 201 | begin 202 | result :=(FNode as TJsonObject).Get('cdata'); 203 | end; 204 | 205 | function TFPCJsonNode.AddPropObj(const Name: string): IDataNode; 206 | var 207 | JObj,Child:TJsonObject; 208 | begin 209 | 210 | JObj :=FNode as TJsonObject; 211 | Child :=TJsonObject.Create; 212 | Jobj.Add(Name,Child); 213 | Result :=self.BuilDataNode(child); 214 | 215 | end; 216 | 217 | function TFPCJsonNode.PropObjByName(const Name: string): IDataNode; 218 | var 219 | JObj,PropObj :TJsonObject; 220 | begin 221 | JObj :=FNode as TJsonObject; 222 | if JObj.Find(LowerCase(Name),PropObj) then 223 | begin 224 | result :=BuilDataNode(PropObj); 225 | end else 226 | begin 227 | result :=nil; 228 | end; 229 | end; 230 | 231 | function TFPCJsonNode.GetDumpText: string; 232 | begin 233 | result :=FNode.AsJSON; 234 | end; 235 | 236 | 237 | 238 | 239 | 240 | function TFPCJsonNode.BuilDataNode(const Node: TJsonData): IDataNode; 241 | var 242 | JNode:TFPCJsonNode; 243 | begin 244 | JNode :=TFPCJsonNode.Create; 245 | JNode.fDoc :=self.fDoc; 246 | JNode.fNode :=Node; 247 | //JNode.FParent :=FNode as TJsonObject; 248 | result :=JNode; 249 | end; 250 | 251 | { TFPCJsonAdapter } 252 | 253 | function TFPCJsonAdapter.NewDoc: IDataNode; 254 | begin 255 | Fdoc :=GetJson('{JSONOBJECT:{}}') as TJsonObject; 256 | end; 257 | 258 | function TFPCJsonAdapter.GetRootNode: IDataNode; 259 | var 260 | Node:TFPCJsonNode; 261 | JObj:TJsonObject; 262 | begin 263 | JObj :=FDoc.Find('JSONOBJECT') as TJsonObject; 264 | Node :=TFPCJsonNode.Create; 265 | Node.fNode :=JObj; 266 | Node.FParent :=FDoc; 267 | Node.fDoc :=fDOc; 268 | result :=Node; 269 | end; 270 | 271 | procedure TFPCJsonAdapter.LoadFromFile(const Filename: string); 272 | var 273 | FS:TFileStream; 274 | begin 275 | FS :=TFileStream.Create(FileName,fmopenRead); 276 | try 277 | FS.Position:=0; 278 | if not Assigned(Fdoc) then FreeAndNil(FDoc); 279 | FDoc :=GetJson(FS) as TJsonObject; 280 | finally 281 | FreeAndNil(FS); 282 | end; 283 | end; 284 | 285 | procedure TFPCJsonAdapter.SaveToFile(const FileName: string); 286 | var 287 | FS:TFileStream; 288 | begin 289 | FS :=TFileStream.Create(FileName,fmcreate); 290 | try 291 | //FDoc.FormatJSON([foUseTabchar,foSkipWhiteSpace]); 292 | FDoc.FormatJSON(DefaultFormat); 293 | Fdoc.DumpJSON(FS); 294 | 295 | finally 296 | FreeAndNil(FS); 297 | end; 298 | end; 299 | 300 | function TFPCJsonAdapter.GetSeralzieString: string; 301 | begin 302 | result :=fdoc.AsString; 303 | end; 304 | 305 | destructor TFPCJsonAdapter.Destroy; 306 | begin 307 | if Assigned(FDoc) then 308 | FreeAndNil(FDoc); 309 | inherited ; 310 | end; 311 | 312 | { TFPCXmlNode } 313 | 314 | function TFPCXmlNode.BuilDataNode(const Node: TDOMNode): IDataNode; 315 | var 316 | xmlNode:TFPCXmlNode; 317 | begin 318 | xmlNode :=TFpcXmlNode.Create; 319 | xmlNode.fDoc :=self.fDoc; 320 | xmlnode.fNode :=Node; 321 | result :=xmlNode; 322 | 323 | end; 324 | 325 | function TFPCXmlNode.GetAttributes(Name: string): string; 326 | begin 327 | result :=fNode.Attributes.GetNamedItem(Name).NodeValue; 328 | end; 329 | 330 | function TFPCXmlNode.GetChildItem(Index: integer): IDataNode; 331 | var 332 | Node:TDOMNode; 333 | begin 334 | //result :=fNode.ChildNodes[Index]; 335 | Node :=fNode.ChildNodes[Index]; 336 | result :=self.BuilDataNode(Node); 337 | end; 338 | 339 | function TFPCXmlNode.GetNodeName: string; 340 | begin 341 | result :=fNode.NodeName; 342 | end; 343 | 344 | function TFPCXmlNode.GetValue: variant; 345 | begin 346 | result :=fNode.NodeValue; 347 | end; 348 | 349 | procedure TFPCXmlNode.SetAttributes(Name: string; AValue: string); 350 | var 351 | attr:TDOMNode; 352 | begin 353 | attr :=FNode.Attributes.GetNamedItem(Name); 354 | if Assigned(Attr) then 355 | begin 356 | attr.NodeValue:=AValue; 357 | end else 358 | begin 359 | if fNode is TDOMElement then 360 | begin 361 | (fNode as TDOMElement).SetAttribute(Name,AValue); 362 | end else 363 | begin 364 | assert(false,'this nod is not a element node'); 365 | end; 366 | end; 367 | end; 368 | 369 | procedure TFPCXmlNode.SetNodeName(AValue: string); 370 | begin 371 | // 372 | end; 373 | 374 | procedure TFPCXmlNode.SetValue(AValue: variant); 375 | begin 376 | fNode.NodeValue :=VarTostr(AValue); 377 | end; 378 | 379 | 380 | 381 | 382 | function TFPCXmlNode.AddChild(): IDataNode; 383 | var 384 | Ele:TDomElement; 385 | begin 386 | Ele :=FDoc.CreateElement('ITEM'); 387 | fNode.AppendChild(Ele); 388 | result :=self.BuilDataNode(Ele); 389 | end; 390 | 391 | function TFPCXmlNode.ChildCount: integer; 392 | begin 393 | result :=FNode.ChildNodes.Count; 394 | end; 395 | 396 | 397 | 398 | procedure TFPCXmlNode.SetData(AValue: string); 399 | var 400 | xmlNode :TFPCXmlNode; 401 | CData:TDOMCDataSection; 402 | begin 403 | CData :=fDoc.CreateCDATASection(AVAlue); 404 | fNode.AppendChild(CData); 405 | 406 | 407 | end; 408 | 409 | function TFPCXmlNode.AddPropObj(const Name: string): IDataNode; 410 | var 411 | Ele:TDOMElement; 412 | begin 413 | Ele :=FDoc.CreateElement(Name); 414 | FNode.AppendChild(Ele); 415 | Result :=self.BuilDataNode(Ele); 416 | 417 | end; 418 | 419 | function TFPCXmlNode.PropObjByName(const Name: string): IDataNode; 420 | var 421 | Node:TDOMNode; 422 | begin 423 | {JObj :=FJSon.O[Name]; 424 | if Assigned(JObj) then 425 | begin 426 | result :=BuildDataNode(JObj) 427 | end else 428 | begin 429 | result :=nil; 430 | end; } 431 | Node :=FDoc.FindNode(Name); 432 | if Assigned(Node) then 433 | begin 434 | result :=self.BuilDataNode(Node); 435 | end else 436 | begin 437 | result :=nil; 438 | end; 439 | end; 440 | 441 | function TFPCXmlNode.GetData: string; 442 | begin 443 | result :=FNode.FindNode('#cdata-section').NodeValue; 444 | end; 445 | 446 | function TFPCXmlNode.GetDumpText: string; 447 | begin 448 | result :=self.fNode.TextContent; 449 | end; 450 | 451 | 452 | 453 | { TFPCXmlAdapter } 454 | 455 | destructor TFPCXmlAdapter.Destroy; 456 | begin 457 | if Assigned(fDoc) then 458 | FreeAndNil(fDoc); 459 | inherited ; 460 | end; 461 | 462 | function TFPCXmlAdapter.NewDoc: IDataNode; 463 | var 464 | Element:TDomElement; 465 | begin 466 | if Assigned(fDoc) then 467 | begin 468 | FreeAndNil(fDoc); 469 | end; 470 | fDoc :=TXMLDocument.Create; 471 | Element :=fdoc.CreateElement('XMLObject'); 472 | Fdoc.AppendChild(Element); 473 | end; 474 | 475 | function TFPCXmlAdapter.GetRootNode: IDataNode; 476 | var 477 | xmlNode:TFPCXmlNode; 478 | begin 479 | xmlNode :=TFPCXmlNode.Create; 480 | xmlNode.fNode :=fDoc.FirstChild; 481 | xmlNode.fDoc :=fDoc; 482 | result :=xmlNode; 483 | end; 484 | 485 | procedure TFPCXmlAdapter.LoadFromFile(const Filename: string); 486 | begin 487 | // 488 | ReadXMLFile(fDoc,FileName); 489 | end; 490 | 491 | procedure TFPCXmlAdapter.SaveToFile(const FileName: string); 492 | begin 493 | 494 | WriteXML(fDoc,FileName); 495 | end; 496 | 497 | function TFPCXmlAdapter.GetSeralzieString: string; 498 | begin 499 | WriteXML(FDoc,result); 500 | end; 501 | 502 | 503 | 504 | end. 505 | 506 | -------------------------------------------------------------------------------- /backup/intf_seralizeadapter.pas: -------------------------------------------------------------------------------- 1 | unit intf_seralizeadapter; 2 | {$IFDEF PFC} 3 | {$mode objfpc}{$H+} 4 | {$ENDIF} 5 | interface 6 | 7 | uses 8 | Classes, SysUtils; 9 | const 10 | DATA_NODE_INTERFACE='{33427852-44EE-4EA8-A339-29C082DF3499}'; 11 | Data_ADAPTER_INTERFACE='{69CFA652-6127-45FC-934E-FD48871E33DF}'; 12 | type 13 | { TDataNode } 14 | 15 | { IDataNode } 16 | 17 | IDataNode=Interface(IInterface) 18 | [DATA_NODE_INTERFACE] 19 | function GetAttributes(Name: string): string; 20 | function GetChildItem(Index:integer): IDataNode; 21 | function GetDumpText: string; 22 | function GetNodeName: string; 23 | function GetValue: variant; 24 | procedure SetAttributes(Name: string; AValue: string); 25 | procedure SetNodeName(AValue: string); 26 | procedure SetValue(AValue: variant); 27 | function AddChild():IDataNode; 28 | function AddPropObj(const Name: string): IDataNode; 29 | function ChildCount:integer; 30 | function PropObjByName(const Name:string): IDataNode; 31 | procedure SetData(AValue: string); 32 | function GetData: string; 33 | 34 | Property ChildItem[Index:integer]:IDataNode read GetChildItem; 35 | Property DATA:string read GetData write SetData; 36 | property NodeName:string read GetNodeName write SetNodeName; 37 | property Value:variant read GetValue write SetValue; 38 | property Attributes[Name:string]:string read GetAttributes write SetAttributes; 39 | property DumpText:string read GetDumpText; 40 | end; 41 | 42 | { IDataAdapter } 43 | 44 | IDataAdapter=interface(IUnknown) 45 | [Data_ADAPTER_INTERFACE] 46 | function NewDoc:IDataNode; 47 | function GetRootNode: IDataNode; 48 | function GetSeralzieString: string; 49 | procedure LoadFromFile(const FileName:string); 50 | procedure SaveToFile(const FileName:string); 51 | property RootNode:IDataNode read GetRootNode; 52 | end; 53 | 54 | 55 | 56 | implementation 57 | 58 | 59 | 60 | { TDataNode } 61 | 62 | 63 | 64 | end. 65 | 66 | -------------------------------------------------------------------------------- /backup/pascalobject_seralize.pas: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ericwang1104/PascalObjectSeralize/911dcbd0a2ce84cdca8a14b0812758d0133e2ef4/backup/pascalobject_seralize.pas -------------------------------------------------------------------------------- /delphi_seralizeadapter.pas: -------------------------------------------------------------------------------- 1 | unit delphi_seralizeadapter; 2 | 3 | interface 4 | 5 | uses 6 | Classes,SysUtils,JsonDataObjects,intf_seralizeadapter; 7 | 8 | type 9 | TDJsonNode = class(TInterfacedObject, IDataNode) 10 | strict private 11 | function AddChild: IDataNode; 12 | function AddPropObj(const Name: string): IDataNode; 13 | function PropObjByName(const Name:string): IDataNode; 14 | function ChildCount: integer; 15 | function GetAttributes(Name: string): string; 16 | function GetChildItem(Index:integer): IDataNode; 17 | function GetData: string; 18 | function GetNodeName: string; 19 | function GetValue: variant; 20 | procedure SetAttributes(Name: string; AValue: string); 21 | procedure SetData(AValue: string); 22 | procedure SetNodeName(AValue: string); 23 | procedure SetValue(AValue: variant); 24 | function GetDumpText:string; 25 | private 26 | protected 27 | fDoc: TJsonObject; 28 | FJSon: TJsonObject; 29 | FParent: TJsonObject; 30 | function BuildDataNode(const Node: TJsonObject): IDataNode; 31 | public 32 | end; 33 | 34 | TDJsonAdapter = class(TInterfacedObject, IDataAdapter) 35 | strict private 36 | function GetRootNode: IDataNode; 37 | function GetSeralzieString: string; 38 | procedure LoadFromFile(const FileName:string); 39 | function NewDoc: IDataNode; 40 | procedure SaveToFile(const FileName:string); 41 | private 42 | FJ: TJsonObject; 43 | public 44 | destructor Destroy; override; 45 | end; 46 | 47 | implementation 48 | 49 | destructor TDJsonAdapter.Destroy; 50 | begin 51 | if Assigned(FJ) then 52 | FreeAndNil(FJ); 53 | inherited; 54 | end; 55 | 56 | function TDJsonAdapter.GetRootNode: IDataNode; 57 | var 58 | Node:TDJsonNode; 59 | JObj:TJsonObject; 60 | begin 61 | 62 | JObj := FJ.O['JSONOBJECT']; 63 | Node :=TDJsonNode.Create; 64 | Node.FJSon :=JObj; 65 | Node.FParent :=FJ; 66 | Node.fDoc :=FJ; 67 | result :=Node; 68 | end; 69 | 70 | function TDJsonAdapter.GetSeralzieString: string; 71 | begin 72 | result :=FJ.ToJSON(); 73 | end; 74 | 75 | procedure TDJsonAdapter.LoadFromFile(const FileName:string); 76 | begin 77 | if Assigned(FJ) then FreeAndNil(FJ); 78 | FJ :=TJsonObject.Create; 79 | FJ.LoadFromFile(FileName); 80 | end; 81 | 82 | function TDJsonAdapter.NewDoc: IDataNode; 83 | begin 84 | if Assigned(FJ) then FreeAndNil(FJ); 85 | FJ :=TJsonObject.Create; 86 | end; 87 | 88 | procedure TDJsonAdapter.SaveToFile(const FileName:string); 89 | begin 90 | FJ.SaveToFile(FileName,false); 91 | 92 | end; 93 | 94 | function TDJsonNode.AddChild: IDataNode; 95 | var 96 | JObj:TJsonObject; 97 | Arr:TJsonArray; 98 | begin 99 | Arr :=FJSon.A['ITEMS']; 100 | Jobj :=Arr.AddObject; 101 | Result :=BuildDataNode(JObj); 102 | end; 103 | 104 | function TDJsonNode.AddPropObj(const Name: string): IDataNode; 105 | var 106 | JObj:TJsonObject; 107 | begin 108 | JObj :=FJSon.O[LowerCase(Name)]; 109 | Result :=BuildDataNode(JObj); 110 | end; 111 | 112 | function TDJsonNode.BuildDataNode(const Node: TJsonObject): IDataNode; 113 | var 114 | JNode:TDJsonNode; 115 | begin 116 | JNode :=TDJsonNode.Create; 117 | JNode.fDoc :=self.fDoc; 118 | JNode.FJSon :=Node; 119 | JNode.FParent := FJSon; 120 | result :=JNode; 121 | end; 122 | 123 | function TDJsonNode.PropObjByName(const Name:string): IDataNode; 124 | var 125 | JObj:TJsonObject; 126 | begin 127 | JObj :=FJSon.O[LowerCase(Name)]; 128 | if Assigned(JObj) then 129 | begin 130 | result :=BuildDataNode(JObj) 131 | end else 132 | begin 133 | result :=nil; 134 | end; 135 | end; 136 | 137 | function TDJsonNode.ChildCount: integer; 138 | begin 139 | Result :=FJSon.A['ITEMS'].Count; 140 | end; 141 | 142 | function TDJsonNode.GetAttributes(Name: string): string; 143 | begin 144 | result :=FJSon.S[LowerCase(Name)]; 145 | end; 146 | 147 | function TDJsonNode.GetChildItem(Index: integer): IDataNode; 148 | var 149 | Obj:TJsonObject; 150 | begin 151 | Obj :=FJSon.A['ITEMS'].O[Index]; 152 | result :=BuildDataNode(Obj); 153 | end; 154 | 155 | function TDJsonNode.GetData: string; 156 | begin 157 | result :=FJSon.Values['cdata'].Value; 158 | end; 159 | 160 | function TDJsonNode.GetDumpText: string; 161 | begin 162 | result :=FJSon.ToJSON(true); 163 | end; 164 | 165 | function TDJsonNode.GetNodeName: string; 166 | begin 167 | result :=FJSon.S['name']; 168 | end; 169 | 170 | function TDJsonNode.GetValue: variant; 171 | begin 172 | result :=FJSon.Values['value'].VariantValue; 173 | end; 174 | 175 | procedure TDJsonNode.SetAttributes(Name, AValue: string); 176 | begin 177 | FJSon.S[LowerCase(Name)] :=AValue; 178 | end; 179 | 180 | procedure TDJsonNode.SetData(AValue: string); 181 | begin 182 | FJSon.Values['cdata'].Value :=AValue; 183 | end; 184 | 185 | procedure TDJsonNode.SetNodeName(AValue: string); 186 | begin 187 | FJSon.S['name'] :=AValue; 188 | end; 189 | 190 | procedure TDJsonNode.SetValue(AValue: variant); 191 | begin 192 | FJSon.Values['value'].VariantValue :=AValue; 193 | end; 194 | 195 | end. 196 | -------------------------------------------------------------------------------- /delphi_test/PascalObjectSeralize.dpr: -------------------------------------------------------------------------------- 1 | program PascalObjectSeralize; 2 | { 3 | 4 | Delphi DUnit Test Project 5 | ------------------------- 6 | This project contains the DUnit test framework and the GUI/Console test runners. 7 | Add "CONSOLE_TESTRUNNER" to the conditional defines entry in the project options 8 | to use the console test runner. Otherwise the GUI test runner will be used by 9 | default. 10 | 11 | } 12 | 13 | {$IFDEF CONSOLE_TESTRUNNER} 14 | {$APPTYPE CONSOLE} 15 | {$ENDIF} 16 | 17 | uses 18 | DUnitTestRunner, 19 | Testpascalobject_seralize in 'Testpascalobject_seralize.pas', 20 | intf_seralizeadapter in '..\intf_seralizeadapter.pas', 21 | JsonDataObjects in '..\JsonDataObjects.pas', 22 | pascalobject_seralize in '..\pascalobject_seralize.pas', 23 | frm_test in 'frm_test.pas' {frmTest}, 24 | delphi_seralizeadapter in '..\delphi_seralizeadapter.pas'; 25 | 26 | {$R *.RES} 27 | 28 | begin 29 | DUnitTestRunner.RunRegisteredTests; 30 | end. 31 | 32 | -------------------------------------------------------------------------------- /delphi_test/PascalObjectSeralize.dproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | {17B7795F-021E-4379-A893-F9841BB2B9D8} 4 | 18.3 5 | VCL 6 | True 7 | Debug 8 | Win32 9 | 1 10 | Console 11 | PascalObjectSeralize.dpr 12 | 13 | 14 | true 15 | 16 | 17 | true 18 | Base 19 | true 20 | 21 | 22 | true 23 | Base 24 | true 25 | 26 | 27 | true 28 | Base 29 | true 30 | 31 | 32 | true 33 | Base 34 | true 35 | 36 | 37 | true 38 | Cfg_1 39 | true 40 | true 41 | 42 | 43 | true 44 | Base 45 | true 46 | 47 | 48 | . 49 | .\$(Platform)\$(Config) 50 | false 51 | false 52 | false 53 | false 54 | false 55 | RESTBackendComponents;CloudService;soaprtl;soapmidas;RESTComponents;emsclientfiredac;DataSnapFireDAC;FireDACIBDriver;emsclient;FireDACCommon;soapserver;FireDACCommonDriver;inet;FireDAC;FireDACSqliteDriver;$(DCC_UsePackage) 56 | System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;$(DCC_Namespace) 57 | $(BDS)\Source\DUnit\src;$(DCC_UnitSearchPath) 58 | _CONSOLE_TESTRUNNER;$(DCC_Define) 59 | PascalObjectSeralize 60 | 61 | 62 | DBXSqliteDriver;tethering;FireDACMSSQLDriver;FireDACDBXDriver;bindengine;FireDACMySQLDriver;DataSnapClient;bindcompdbx;IndyIPServer;dac250;IndySystem;fmxFireDAC;emshosting;FireDACTDataDriver;FMXTee;DbxCommonDriver;xmlrtl;DataSnapNativeClient;fmxobj;rtl;DbxClientDriver;DBXSybaseASADriver;IndyIPClient;FireDACODBCDriver;DataSnapIndy10ServerTransport;DataSnapProviderClient;FireDACMongoDBDriver;DataSnapServerMidas;DBXInterBaseDriver;bindcompfmx;DBXOracleDriver;unidac250;inetdb;FmxTeeUI;emsedge;fmx;fmxdae;dbexpress;IndyCore;dsnap;DataSnapCommon;FireDACOracleDriver;DBXMySQLDriver;DBXFirebirdDriver;FireDACCommonODBC;IndyIPCommon;FireDACPgDriver;ibmonitor;FireDACASADriver;ibxpress;DataSnapServer;ibxbindings;FireDACDSDriver;CustomIPTransport;bindcomp;DBXInformixDriver;dbxcds;dsnapxml;dbrtl;inetdbxpress;IndyProtocols;fmxase;$(DCC_UsePackage) 63 | 64 | 65 | DBXSqliteDriver;dxSpreadSheetCoreDialogsRS25;dxRibbonCustomizationFormRS25;DBXDb2Driver;dxPSPrVwRibbonRS25;dxSkinOffice2007PinkRS25;dxSkinMcSkinRS25;vclactnband;vclFireDAC;cxExportRS25;dxSpreadSheetInplaceRichEditRS25;dxHttpIndyRequestRS25;tethering;dxPScxCommonRS25;FireDACADSDriver;cxPivotGridOLAPRS25;rtcSDK;FireDACMSSQLDriver;cxSchedulerGridRS25;vcltouch;dxSkinDarkRoomRS25;dxSkinDarkSideRS25;vcldb;Intraweb;svn;dxGaugeControlRS25;cxLibraryRS25;dxSkinOffice2007SilverRS25;dxSkinBlackRS25;dxSkinOffice2007BlueRS25;vclib;dxFlowChartAdvancedCustomizeFormRS25;dxSkinOffice2007BlackRS25;FireDACDBXDriver;dxSkinVS2010RS25;vclx;dxSkinFoggyRS25;dxSpreadSheetConditionalFormattingDialogsRS25;dxSkinSevenRS25;dxSkinSpringTimeRS25;dxTileControlRS25;dxMapControlRS25;dxPDFViewerRS25;dxDockingRS25;VCLRESTComponents;cxPageControlRS25;dxSkinLilianRS25;dxPSLnksRS25;dxWizardControlRS25;dxRichEditControlRS25;vclie;bindengine;dxFireDACServerModeRS25;FireDACMySQLDriver;dxSkinOffice2013LightGrayRS25;dxSkinMetropolisRS25;DataSnapClient;rtcSDK_DBA;dxPSdxPDFViewerLnkRS25;dxSkinOffice2016DarkRS25;bindcompdbx;dxSkinBlueprintRS25;dxSkinStardustRS25;DBXSybaseASEDriver;IndyIPServer;dxPSdxLCLnkRS25;dac250;IndySystem;dxSkinOffice2007GreenRS25;TsiLang_XE10r;dsnapcon;VirtualTreesR;dxLayoutControlRS25;dxPSRichEditControlLnkRS25;FireDACMSAccDriver;fmxFireDAC;FireDACInfxDriver;vclimg;dxdbtrRS25;dxPScxTLLnkRS25;emshosting;dxSpreadSheetRS25;dxSkinVisualStudio2013LightRS25;DBXOdbcDriver;FireDACTDataDriver;FMXTee;cxGridRS25;KGrid_DXER;DbxCommonDriver;CodeSiteLoggingPkg;dxorgcRS25;dxSpreadSheetCoreConditionalFormattingDialogsRS25;dxSkinTheAsphaltWorldRS25;dxSkinHighContrastRS25;dxPScxSchedulerLnkRS25;xmlrtl;DataSnapNativeClient;fmxobj;dxPScxGridLnkRS25;rtl;DbxClientDriver;dacvcl250;DBXSybaseASADriver;dxPSCoreRS25;dxmdsRS25;clinetsuite_xe8;dxSkinOffice2016ColorfulRS25;appanalytics;IndyIPClient;bindcompvcl;dxThemeRS25;TeeUI;VclSmp;FireDACODBCDriver;DataSnapIndy10ServerTransport;DataSnapProviderClient;FireDACMongoDBDriver;cxVerticalGridRS25;dxtrmdRS25;dxADOServerModeRS25;dxSkinPumpkinRS25;DataSnapServerMidas;dxCoreRS25;cxSchedulerTreeBrowserRS25;dxRichEditControlCoreRS25;DBXInterBaseDriver;dxSkinValentineRS25;dxPSTeeChartRS25;svnui;dxSkinOffice2010BlueRS25;dxSkinMoneyTwinsRS25;dxSkinSilverRS25;DBXMSSQLDriver;dxPSdxFCLnkRS25;dxRichEditCoreRS25;DatasnapConnectorsFreePascal;dxSkinOffice2013WhiteRS25;bindcompfmx;DBXOracleDriver;unidac250;inetdb;dxOfficeCoreRS25;FmxTeeUI;emsedge;fmx;fmxdae;dxSkinBlueRS25;dxTabbedMDIRS25;dxBarDBNavRS25;dxPScxPivotGridLnkRS25;dxSkinDevExpressDarkStyleRS25;dbexpress;IndyCore;dxFlowChartRS25;dxRichEditDocumentModelRS25;dsnap;DataSnapCommon;dxBarRS25;dxPSDBTeeChartRS25;dxSkinLiquidSkyRS25;dxdborRS25;DataSnapConnectors;dxPScxExtCommonRS25;cxPivotGridRS25;dxPSdxSpreadSheetLnkRS25;dxSpreadSheetReportDesignerRS25;dxNavBarRS25;cxSchedulerRibbonStyleEventEditorRS25;dxSkinCoffeeRS25;FireDACOracleDriver;DBXMySQLDriver;DBXFirebirdDriver;FireDACCommonODBC;dxSkinOffice2010SilverRS25;cxTreeListRS25;IndyIPCommon;dxSkinLondonLiquidSkyRS25;vcl;dxPScxVGridLnkRS25;dxBarExtItemsRS25;dxSkinsCoreRS25;dxComnRS25;FireDACDb2Driver;dxSkinWhiteprintRS25;dxPSdxDBTVLnkRS25;dxSkinVisualStudio2013BlueRS25;dxSkinGlassOceansRS25;dxSkinMetropolisDarkRS25;dxSkinOffice2013DarkGrayRS25;dxSkinSharpPlusRS25;TeeDB;dxSpreadSheetCoreRS25;dxServerModeRS25;dxPScxPCProdRS25;dxSkinCaramelRS25;DCP_XE7;FireDACPgDriver;ibmonitor;FireDACASADriver;cxEditorsRS25;dxSkiniMaginaryRS25;ibxpress;Tee;CodeSiteDBToolsPkg;DataSnapServer;ibxbindings;dxPsPrVwAdvRS25;vclwinx;FireDACDSDriver;dxSkinSevenClassicRS25;cxDataRS25;dxRichEditInplaceRS25;cxTreeListdxBarPopupMenuRS25;CustomIPTransport;vcldsnap;dxPSdxOCLnkRS25;dxSkinSharpRS25;bindcomp;DBXInformixDriver;cxPivotGridChartRS25;cxSchedulerRS25;dxBarExtDBItemsRS25;dxSkinVisualStudio2013DarkRS25;dxSkinOffice2010BlackRS25;dxDBXServerModeRS25;dxSkinDevExpressStyleRS25;dxGDIPlusRS25;dxPSdxGaugeControlLnkRS25;dbxcds;unidacvcl250;adortl;dxPSdxDBOCLnkRS25;dxRibbonRS25;dsnapxml;dxSpellCheckerRS25;dbrtl;inetdbxpress;IndyProtocols;dxSkinSummer2008RS25;dxPSdxMapControlLnkRS25;dxSkinXmas2008BlueRS25;fmxase;$(DCC_UsePackage) 66 | Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) 67 | Debug 68 | CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= 69 | 1033 70 | 71 | 72 | DBXSqliteDriver;dxSpreadSheetCoreDialogsRS25;dxRibbonCustomizationFormRS25;DBXDb2Driver;dxPSPrVwRibbonRS25;dxSkinOffice2007PinkRS25;dxSkinMcSkinRS25;vclactnband;vclFireDAC;cxExportRS25;dxSpreadSheetInplaceRichEditRS25;dxHttpIndyRequestRS25;tethering;dxPScxCommonRS25;FireDACADSDriver;cxPivotGridOLAPRS25;FireDACMSSQLDriver;cxSchedulerGridRS25;vcltouch;dxSkinDarkRoomRS25;dxSkinDarkSideRS25;vcldb;Intraweb;dxGaugeControlRS25;cxLibraryRS25;dxSkinOffice2007SilverRS25;dxSkinBlackRS25;dxSkinOffice2007BlueRS25;vclib;dxFlowChartAdvancedCustomizeFormRS25;dxSkinOffice2007BlackRS25;FireDACDBXDriver;dxSkinVS2010RS25;vclx;dxSkinFoggyRS25;dxSpreadSheetConditionalFormattingDialogsRS25;dxSkinSevenRS25;dxSkinSpringTimeRS25;dxTileControlRS25;dxMapControlRS25;dxPDFViewerRS25;dxDockingRS25;VCLRESTComponents;cxPageControlRS25;dxSkinLilianRS25;dxPSLnksRS25;dxWizardControlRS25;dxRichEditControlRS25;vclie;bindengine;dxFireDACServerModeRS25;FireDACMySQLDriver;dxSkinOffice2013LightGrayRS25;dxSkinMetropolisRS25;DataSnapClient;dxPSdxPDFViewerLnkRS25;dxSkinOffice2016DarkRS25;bindcompdbx;dxSkinBlueprintRS25;dxSkinStardustRS25;DBXSybaseASEDriver;IndyIPServer;dxPSdxLCLnkRS25;dac250;IndySystem;dxSkinOffice2007GreenRS25;dsnapcon;VirtualTreesR;dxLayoutControlRS25;dxPSRichEditControlLnkRS25;FireDACMSAccDriver;fmxFireDAC;FireDACInfxDriver;vclimg;dxdbtrRS25;dxPScxTLLnkRS25;emshosting;dxSpreadSheetRS25;dxSkinVisualStudio2013LightRS25;DBXOdbcDriver;FireDACTDataDriver;FMXTee;cxGridRS25;DbxCommonDriver;dxorgcRS25;dxSpreadSheetCoreConditionalFormattingDialogsRS25;dxSkinTheAsphaltWorldRS25;dxSkinHighContrastRS25;dxPScxSchedulerLnkRS25;xmlrtl;DataSnapNativeClient;fmxobj;dxPScxGridLnkRS25;rtl;DbxClientDriver;dacvcl250;DBXSybaseASADriver;dxPSCoreRS25;dxmdsRS25;clinetsuite_xe8;dxSkinOffice2016ColorfulRS25;appanalytics;IndyIPClient;bindcompvcl;dxThemeRS25;TeeUI;VclSmp;FireDACODBCDriver;DataSnapIndy10ServerTransport;DataSnapProviderClient;FireDACMongoDBDriver;cxVerticalGridRS25;dxtrmdRS25;dxADOServerModeRS25;dxSkinPumpkinRS25;DataSnapServerMidas;dxCoreRS25;cxSchedulerTreeBrowserRS25;dxRichEditControlCoreRS25;DBXInterBaseDriver;dxSkinValentineRS25;dxPSTeeChartRS25;dxSkinOffice2010BlueRS25;dxSkinMoneyTwinsRS25;dxSkinSilverRS25;DBXMSSQLDriver;dxPSdxFCLnkRS25;dxRichEditCoreRS25;DatasnapConnectorsFreePascal;dxSkinOffice2013WhiteRS25;bindcompfmx;DBXOracleDriver;unidac250;inetdb;dxOfficeCoreRS25;FmxTeeUI;emsedge;fmx;fmxdae;dxSkinBlueRS25;dxTabbedMDIRS25;dxBarDBNavRS25;dxPScxPivotGridLnkRS25;dxSkinDevExpressDarkStyleRS25;dbexpress;IndyCore;dxFlowChartRS25;dxRichEditDocumentModelRS25;dsnap;DataSnapCommon;dxBarRS25;dxPSDBTeeChartRS25;dxSkinLiquidSkyRS25;dxdborRS25;DataSnapConnectors;dxPScxExtCommonRS25;cxPivotGridRS25;dxPSdxSpreadSheetLnkRS25;dxSpreadSheetReportDesignerRS25;dxNavBarRS25;cxSchedulerRibbonStyleEventEditorRS25;dxSkinCoffeeRS25;FireDACOracleDriver;DBXMySQLDriver;DBXFirebirdDriver;FireDACCommonODBC;dxSkinOffice2010SilverRS25;cxTreeListRS25;IndyIPCommon;dxSkinLondonLiquidSkyRS25;vcl;dxPScxVGridLnkRS25;dxBarExtItemsRS25;dxSkinsCoreRS25;dxComnRS25;FireDACDb2Driver;dxSkinWhiteprintRS25;dxPSdxDBTVLnkRS25;dxSkinVisualStudio2013BlueRS25;dxSkinGlassOceansRS25;dxSkinMetropolisDarkRS25;dxSkinOffice2013DarkGrayRS25;dxSkinSharpPlusRS25;TeeDB;dxSpreadSheetCoreRS25;dxServerModeRS25;dxPScxPCProdRS25;dxSkinCaramelRS25;FireDACPgDriver;ibmonitor;FireDACASADriver;cxEditorsRS25;dxSkiniMaginaryRS25;ibxpress;Tee;DataSnapServer;ibxbindings;dxPsPrVwAdvRS25;vclwinx;FireDACDSDriver;dxSkinSevenClassicRS25;cxDataRS25;dxRichEditInplaceRS25;cxTreeListdxBarPopupMenuRS25;CustomIPTransport;vcldsnap;dxPSdxOCLnkRS25;dxSkinSharpRS25;bindcomp;DBXInformixDriver;cxPivotGridChartRS25;cxSchedulerRS25;dxBarExtDBItemsRS25;dxSkinVisualStudio2013DarkRS25;dxSkinOffice2010BlackRS25;dxDBXServerModeRS25;dxSkinDevExpressStyleRS25;dxGDIPlusRS25;dxPSdxGaugeControlLnkRS25;dbxcds;unidacvcl250;adortl;dxPSdxDBOCLnkRS25;dxRibbonRS25;dsnapxml;dxSpellCheckerRS25;dbrtl;inetdbxpress;IndyProtocols;dxSkinSummer2008RS25;dxPSdxMapControlLnkRS25;dxSkinXmas2008BlueRS25;fmxase;$(DCC_UsePackage) 73 | 74 | 75 | DEBUG;$(DCC_Define) 76 | true 77 | false 78 | true 79 | true 80 | true 81 | 82 | 83 | false 84 | 1033 85 | (None) 86 | 87 | 88 | false 89 | RELEASE;$(DCC_Define) 90 | 0 91 | 0 92 | 93 | 94 | 95 | MainSource 96 | 97 | 98 | 99 | 100 | 101 | 102 |
frmTest
103 | dfm 104 |
105 | 106 | 107 | Cfg_2 108 | Base 109 | 110 | 111 | Base 112 | 113 | 114 | Cfg_1 115 | Base 116 | 117 |
118 | 119 | Delphi.Personality.12 120 | Application 121 | 122 | 123 | 124 | PascalObjectSeralize.dpr 125 | 126 | 127 | Embarcadero C++Builder Office 2000 Servers Package 128 | Embarcadero C++Builder Office XP Servers Package 129 | Microsoft Office 2000 Sample Automation Server Wrapper Components 130 | Microsoft Office XP Sample Automation Server Wrapper Components 131 | 132 | 133 | 134 | 135 | 136 | PascalObjectSeralize.exe 137 | true 138 | 139 | 140 | 141 | 142 | 1 143 | 144 | 145 | Contents\MacOS 146 | 1 147 | 148 | 149 | Contents\MacOS 150 | 0 151 | 152 | 153 | 154 | 155 | classes 156 | 1 157 | 158 | 159 | 160 | 161 | library\lib\armeabi-v7a 162 | 1 163 | 164 | 165 | 166 | 167 | library\lib\armeabi 168 | 1 169 | 170 | 171 | 172 | 173 | library\lib\mips 174 | 1 175 | 176 | 177 | 178 | 179 | library\lib\armeabi-v7a 180 | 1 181 | 182 | 183 | 184 | 185 | res\drawable 186 | 1 187 | 188 | 189 | 190 | 191 | res\values 192 | 1 193 | 194 | 195 | 196 | 197 | res\drawable 198 | 1 199 | 200 | 201 | 202 | 203 | res\drawable-xxhdpi 204 | 1 205 | 206 | 207 | 208 | 209 | res\drawable-ldpi 210 | 1 211 | 212 | 213 | 214 | 215 | res\drawable-mdpi 216 | 1 217 | 218 | 219 | 220 | 221 | res\drawable-hdpi 222 | 1 223 | 224 | 225 | 226 | 227 | res\drawable-xhdpi 228 | 1 229 | 230 | 231 | 232 | 233 | res\drawable-small 234 | 1 235 | 236 | 237 | 238 | 239 | res\drawable-normal 240 | 1 241 | 242 | 243 | 244 | 245 | res\drawable-large 246 | 1 247 | 248 | 249 | 250 | 251 | res\drawable-xlarge 252 | 1 253 | 254 | 255 | 256 | 257 | 1 258 | 259 | 260 | Contents\MacOS 261 | 1 262 | 263 | 264 | 0 265 | 266 | 267 | 268 | 269 | Contents\MacOS 270 | 1 271 | .framework 272 | 273 | 274 | 0 275 | 276 | 277 | 278 | 279 | 1 280 | .dylib 281 | 282 | 283 | 1 284 | .dylib 285 | 286 | 287 | 1 288 | .dylib 289 | 290 | 291 | Contents\MacOS 292 | 1 293 | .dylib 294 | 295 | 296 | 0 297 | .dll;.bpl 298 | 299 | 300 | 301 | 302 | 1 303 | .dylib 304 | 305 | 306 | 1 307 | .dylib 308 | 309 | 310 | 1 311 | .dylib 312 | 313 | 314 | Contents\MacOS 315 | 1 316 | .dylib 317 | 318 | 319 | 0 320 | .bpl 321 | 322 | 323 | 324 | 325 | 0 326 | 327 | 328 | 0 329 | 330 | 331 | 0 332 | 333 | 334 | 0 335 | 336 | 337 | Contents\Resources\StartUp\ 338 | 0 339 | 340 | 341 | 0 342 | 343 | 344 | 345 | 346 | 1 347 | 348 | 349 | 1 350 | 351 | 352 | 1 353 | 354 | 355 | 356 | 357 | 1 358 | 359 | 360 | 1 361 | 362 | 363 | 1 364 | 365 | 366 | 367 | 368 | 1 369 | 370 | 371 | 1 372 | 373 | 374 | 1 375 | 376 | 377 | 378 | 379 | 1 380 | 381 | 382 | 1 383 | 384 | 385 | 1 386 | 387 | 388 | 389 | 390 | 1 391 | 392 | 393 | 1 394 | 395 | 396 | 1 397 | 398 | 399 | 400 | 401 | 1 402 | 403 | 404 | 1 405 | 406 | 407 | 1 408 | 409 | 410 | 411 | 412 | 1 413 | 414 | 415 | 1 416 | 417 | 418 | 1 419 | 420 | 421 | 422 | 423 | 1 424 | 425 | 426 | 427 | 428 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 429 | 1 430 | 431 | 432 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 433 | 1 434 | 435 | 436 | 437 | 438 | 1 439 | 440 | 441 | 1 442 | 443 | 444 | 445 | 446 | ..\ 447 | 1 448 | 449 | 450 | ..\ 451 | 1 452 | 453 | 454 | 455 | 456 | 1 457 | 458 | 459 | 1 460 | 461 | 462 | 1 463 | 464 | 465 | 466 | 467 | 1 468 | 469 | 470 | 1 471 | 472 | 473 | 1 474 | 475 | 476 | 477 | 478 | ..\ 479 | 1 480 | 481 | 482 | 483 | 484 | Contents 485 | 1 486 | 487 | 488 | 489 | 490 | Contents\Resources 491 | 1 492 | 493 | 494 | 495 | 496 | library\lib\armeabi-v7a 497 | 1 498 | 499 | 500 | 1 501 | 502 | 503 | 1 504 | 505 | 506 | 1 507 | 508 | 509 | 1 510 | 511 | 512 | Contents\MacOS 513 | 1 514 | 515 | 516 | 0 517 | 518 | 519 | 520 | 521 | 1 522 | 523 | 524 | 1 525 | 526 | 527 | 528 | 529 | Assets 530 | 1 531 | 532 | 533 | Assets 534 | 1 535 | 536 | 537 | 538 | 539 | Assets 540 | 1 541 | 542 | 543 | Assets 544 | 1 545 | 546 | 547 | 548 | 549 | 550 | 551 | 552 | 553 | 554 | 555 | 556 | 557 | False 558 | True 559 | False 560 | 561 | 562 | DUnit / Delphi Win32 563 | GUI 564 | 565 | 566 | 567 | 568 | 12 569 | 570 | 571 | 572 | 573 |
574 | -------------------------------------------------------------------------------- /delphi_test/PascalObjectSeralize.dproj.local: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 2018/03/08 10:58:29.000.573,=E:\GitHub\PascalObjectSeralize\delphi_test\Testpascalobject_seralize.pas 5 | 2018/03/08 10:58:48.000.536,=E:\GitHub\PascalObjectSeralize\pascalobject_seralize.pas 6 | 2018/03/08 10:58:48.000.293,=E:\GitHub\PascalObjectSeralize\JsonDataObjects.pas 7 | 2018/03/08 10:58:48.000.096,=E:\GitHub\PascalObjectSeralize\intf_seralizeadapter.pas 8 | 2018/03/08 11:01:19.000.774,=E:\GitHub\PascalObjectSeralize\delphi_test\Unit1.pas 9 | 2018/03/08 11:01:31.000.644,E:\GitHub\PascalObjectSeralize\delphi_test\frm_test.pas=E:\GitHub\PascalObjectSeralize\delphi_test\Unit1.pas 10 | 2018/03/08 11:01:31.000.644,E:\GitHub\PascalObjectSeralize\delphi_test\frm_test.dfm=E:\GitHub\PascalObjectSeralize\delphi_test\Unit1.dfm 11 | 2018/03/08 11:03:24.000.533,=E:\GitHub\PascalObjectSeralize\delphi_seralizeadapter.pas 12 | 13 | 14 | -------------------------------------------------------------------------------- /delphi_test/PascalObjectSeralize.identcache: -------------------------------------------------------------------------------- 1 | 2E:\GitHub\PascalObjectSeralize\JsonDataObjects.pas9E:\GitHub\PascalObjectSeralize\delphi_seralizeadapter.pas8E:\GitHub\PascalObjectSeralize\pascalobject_seralize.pasCE:\GitHub\PascalObjectSeralize\delphi_test\PascalObjectSeralize.dpr7E:\GitHub\PascalObjectSeralize\intf_seralizeadapter.pasHE:\GitHub\PascalObjectSeralize\delphi_test\Testpascalobject_seralize.pas7E:\GitHub\PascalObjectSeralize\delphi_test\frm_test.pas -------------------------------------------------------------------------------- /delphi_test/PascalObjectSeralize.res: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ericwang1104/PascalObjectSeralize/911dcbd0a2ce84cdca8a14b0812758d0133e2ef4/delphi_test/PascalObjectSeralize.res -------------------------------------------------------------------------------- /delphi_test/PascalObjectSeralize.skincfg: -------------------------------------------------------------------------------- 1 | [ExpressSkins] 2 | Default=1 3 | ShowNotifications=1 4 | Enabled=1 5 | dxSkinBlack=0 6 | dxSkinBlue=0 7 | dxSkinBlueprint=0 8 | dxSkinCaramel=0 9 | dxSkinCoffee=0 10 | dxSkinDarkRoom=0 11 | dxSkinDarkSide=0 12 | dxSkinDevExpressDarkStyle=0 13 | dxSkinDevExpressStyle=0 14 | dxSkinFoggy=0 15 | dxSkinGlassOceans=0 16 | dxSkinHighContrast=0 17 | dxSkiniMaginary=0 18 | dxSkinLilian=0 19 | dxSkinLiquidSky=0 20 | dxSkinLondonLiquidSky=0 21 | dxSkinMcSkin=0 22 | dxSkinMetropolis=0 23 | dxSkinMetropolisDark=0 24 | dxSkinMoneyTwins=0 25 | dxSkinOffice2007Black=0 26 | dxSkinOffice2007Blue=0 27 | dxSkinOffice2007Green=0 28 | dxSkinOffice2007Pink=0 29 | dxSkinOffice2007Silver=0 30 | dxSkinOffice2010Black=0 31 | dxSkinOffice2010Blue=0 32 | dxSkinOffice2010Silver=0 33 | dxSkinOffice2013DarkGray=0 34 | dxSkinOffice2013LightGray=0 35 | dxSkinOffice2013White=1 36 | dxSkinOffice2016Colorful=1 37 | dxSkinOffice2016Dark=1 38 | dxSkinPumpkin=0 39 | dxSkinSeven=0 40 | dxSkinSevenClassic=0 41 | dxSkinSharp=0 42 | dxSkinSharpPlus=0 43 | dxSkinSilver=0 44 | dxSkinSpringTime=0 45 | dxSkinStardust=0 46 | dxSkinSummer2008=0 47 | dxSkinTheAsphaltWorld=0 48 | dxSkinsDefaultPainters=0 49 | dxSkinValentine=0 50 | dxSkinVisualStudio2013Blue=1 51 | dxSkinVisualStudio2013Dark=1 52 | dxSkinVisualStudio2013Light=1 53 | dxSkinVS2010=0 54 | dxSkinWhiteprint=0 55 | dxSkinXmas2008Blue=0 56 | -------------------------------------------------------------------------------- /delphi_test/PascalObjectSeralize.stat: -------------------------------------------------------------------------------- 1 | [Stats] 2 | EditorSecs=2590 3 | DesignerSecs=6 4 | InspectorSecs=14 5 | CompileSecs=21228 6 | OtherSecs=700 7 | StartTime=2018/3/8 10:06:08 8 | RealKeys=0 9 | EffectiveKeys=0 10 | DebugSecs=1 11 | -------------------------------------------------------------------------------- /delphi_test/Testpascalobject_seralize.pas: -------------------------------------------------------------------------------- 1 | unit Testpascalobject_seralize; 2 | { 3 | 4 | Delphi DUnit Test Case 5 | ---------------------- 6 | This unit contains a skeleton test case class generated by the Test Case Wizard. 7 | Modify the generated code to correctly setup and call the methods from the unit 8 | being tested. 9 | 10 | } 11 | 12 | interface 13 | 14 | uses 15 | TestFramework, pascalobject_seralize, intf_SeralizeadApter,delphi_seralizeadapter, TypInfo, Classes, 16 | SysUtils, System.NetEncoding, Variants,Dateutils, graphics,frm_test; 17 | 18 | type 19 | { TDataItem } 20 | 21 | TDataItem =Class(TcollectionItem) 22 | private 23 | FDateTime: TDateTime; 24 | fdbl: double; 25 | FInteger: integer; 26 | FStr: string; 27 | published 28 | property testInteger:integer read FInteger write FInteger; 29 | property testDate:TDateTime read FDateTime write FDateTime; 30 | property testString:string read FStr write FStr; 31 | property testFloat:double read fdbl write fdbl; 32 | end; 33 | { TDataCollection } 34 | 35 | TDataCollection=class(TCollection) 36 | 37 | private 38 | FName: string; 39 | function GetDataItem(Index: integer): TDataItem; 40 | public 41 | function AddDataItem:TDataItem; 42 | property DataItem[Index:integer]:TDataItem read GetDataItem; 43 | published 44 | property datacollectionName:string read FName write FName; 45 | end; 46 | 47 | type 48 | { TestPascalSeralize } 49 | 50 | TestPascalSeralize=class(TTestCase) 51 | protected 52 | Ffrm:TfrmTest; 53 | procedure Setup;override; 54 | procedure TearDown;override; 55 | published 56 | procedure TestGetPropInfo; 57 | end; 58 | 59 | type 60 | { TestSearalizeObject } 61 | 62 | TestSearalizeObject= class(TTestCase) 63 | private 64 | function SampleDataPath: string; 65 | protected 66 | FW:TMyCustomWriter; 67 | FR:TMyCustomReader; 68 | 69 | procedure SetUp; override; 70 | procedure TearDown; override; 71 | public 72 | published 73 | procedure TestReadfrmTest; 74 | procedure TestWritefrmTest; 75 | procedure TestWriteCollection; 76 | procedure TEstReadCollection; 77 | 78 | procedure TestWriteFrmTest_JsonAdapter; 79 | procedure TestReadFrmTest_JsonAdapter; 80 | procedure TestWriteCollection_Json; 81 | procedure TEstReadCollection_Json; 82 | end; 83 | 84 | 85 | 86 | 87 | implementation 88 | 89 | { TDataCollection } 90 | 91 | function TDataCollection.GetDataItem(Index: integer): TDataItem; 92 | begin 93 | result :=self.Items[Index] as TDataItem; 94 | end; 95 | 96 | function TDataCollection.AddDataItem: TDataItem; 97 | begin 98 | result :=TDataItem.Create(self); 99 | end; 100 | 101 | { TestPascalSeralize } 102 | 103 | procedure TestPascalSeralize.Setup; 104 | begin 105 | inherited ; 106 | fFrm :=TfrmTest.Create(nil); 107 | end; 108 | 109 | procedure TestPascalSeralize.TearDown; 110 | begin 111 | FreeAndNil(fFrm); 112 | inherited ; 113 | end; 114 | 115 | procedure TestPascalSeralize.TestGetPropInfo; 116 | var 117 | I: Integer; 118 | PList: PPropList; 119 | intPropCount: Integer; 120 | PInfo: PPropInfo; 121 | begin 122 | 123 | 124 | // Save Collection 125 | intPropCount := GetTypeData(ffrm.ClassInfo)^.PropCount; 126 | GetMem(PList, intPropCount * SizeOf(Pointer)); 127 | try 128 | intPropCount := GetPropList(ffrm.ClassInfo, tkAny, PList); 129 | for I := 0 to intPropCount-1 do 130 | begin 131 | PInfo :=PList^[I]; 132 | 133 | {$IFDEF DEBUG} 134 | 135 | 136 | //SendInteger('Prop Index:',Pinfo^.PropProcs); 137 | //SendDebug('PropName:'+Pinfo^.Name); 138 | {$ENDIF} 139 | end; 140 | 141 | finally 142 | FreeMem(PList, intPropCount * SizeOf(Pointer)); 143 | end; 144 | 145 | 146 | end; 147 | 148 | function TestSearalizeObject.SampleDataPath: string; 149 | begin 150 | result :='..\..\..\testdata\'; 151 | end; 152 | 153 | procedure TestSearalizeObject.TestWritefrmTest; 154 | var 155 | Iadp:IDataAdapter; 156 | frm:TfrmTest; 157 | begin 158 | iadp :=TDJsonAdapter.Create; 159 | frm :=TfrmTest.Create(nil); 160 | try 161 | fW.Adapter :=Iadp; 162 | frm.Image1.Picture.LoadFromFile(SampleDataPath+'test.png'); 163 | frm.ShowModal; 164 | fw.WriteObjectToFile(SampleDataPath+'test.xml',frm); 165 | finally 166 | FreeAndnil(frm); 167 | end; 168 | 169 | end; 170 | 171 | procedure TestSearalizeObject.TestWriteCollection; 172 | var 173 | coll:TDataCollection; 174 | Item:TDataItem; 175 | IAdp:TDJsonAdapter; 176 | begin 177 | Coll :=TDatacollection.Create(TdataItem); 178 | IAdp :=TDJsonAdapter.Create; 179 | try 180 | Coll.datacollectionName:='TestDataName'; 181 | 182 | Item :=coll.AddDataItem; 183 | item.testDate:=now; 184 | item.testFloat:=3.14; 185 | item.testInteger:=28; 186 | item.testString:='hello world'; 187 | fw.Adapter :=IAdp; 188 | fw.WriteObjectToFile(SampleDataPath+'testCollection.xml',Coll); 189 | 190 | finally 191 | FreeAndNil( Coll); 192 | end; 193 | end; 194 | 195 | procedure TestSearalizeObject.TEstReadCollection; 196 | var 197 | coll:TDataCollection; 198 | Item:TDataItem; 199 | IAdp:TDJsonAdapter; 200 | begin 201 | Coll :=TDatacollection.Create(TdataItem); 202 | IAdp :=TDJsonAdapter.Create; 203 | try 204 | fr.Adapter :=IAdp; 205 | fr.ReadFileToObject(SampleDataPath+'testcollection.xml',coll); 206 | checkequals(Coll.datacollectionName,'TestDataName'); 207 | Item :=Coll.DataItem[0]; 208 | 209 | checkequals(item.testString,'hello world'); 210 | checkequals(item.testInteger,28); 211 | checkequals(item.testFloat,3.14); 212 | checkequals(YearOf(item.testDate),yearOf(now)); 213 | 214 | finally 215 | FreeAndNil( Coll); 216 | end; 217 | 218 | end; 219 | 220 | procedure TestSearalizeObject.TestWriteFrmTest_JsonAdapter; 221 | var 222 | Iadp:IDataAdapter; 223 | frm:TfrmTest; 224 | begin 225 | iadp :=TDJsonAdapter.Create; 226 | frm :=TfrmTest.Create(nil); 227 | try 228 | fW.Adapter :=Iadp; 229 | // frm.Image1.Picture.LoadFromFile('E:\GitHub\PascalObjectSeralize\testdata\'+'test.png'); 230 | frm.ShowModal; 231 | fw.WriteObjectToFile(SampleDataPath+'test.json',frm); 232 | finally 233 | FreeAndnil(frm); 234 | end; 235 | end; 236 | 237 | procedure TestSearalizeObject.TestReadFrmTest_JsonAdapter; 238 | var 239 | Iadp:IDataAdapter; 240 | frm:TfrmTest; 241 | begin 242 | iadp :=TDJsonAdapter.Create; 243 | frm :=TfrmTest.Create(nil); 244 | try 245 | fr.Adapter :=Iadp; 246 | fr.ReadFileToObject(SampleDataPath+'test.json',frm) ; 247 | frm.ShowModal; 248 | finally 249 | FreeAndnil(frm); 250 | end; 251 | 252 | 253 | end; 254 | 255 | procedure TestSearalizeObject.TestWriteCollection_Json; 256 | var 257 | coll:TDataCollection; 258 | Item:TDataItem; 259 | IAdp:IDataAdapter; 260 | begin 261 | Coll :=TDatacollection.Create(TdataItem); 262 | IAdp :=TDJsonAdapter.Create; 263 | try 264 | Coll.datacollectionName:='TestDataName'; 265 | 266 | Item :=coll.AddDataItem; 267 | item.testDate:=now; 268 | item.testFloat:=3.14; 269 | item.testInteger:=28; 270 | item.testString:='hello world'; 271 | 272 | 273 | Item :=coll.AddDataItem; 274 | Item.testDate :=Date; 275 | item.testFloat :=2.2; 276 | item.testInteger :=9; 277 | item.testString :='delphi test'; 278 | 279 | fw.Adapter :=IAdp; 280 | 281 | fw.WriteObjectToFile(SampleDataPath+'testCollection.Json',Coll); 282 | 283 | finally 284 | FreeAndNil( Coll); 285 | end; 286 | 287 | end; 288 | 289 | procedure TestSearalizeObject.TEstReadCollection_Json; 290 | var 291 | coll:TDataCollection; 292 | Item:TDataItem; 293 | IAdp:IDataAdapter; 294 | begin 295 | Coll :=TDatacollection.Create(TdataItem); 296 | IAdp :=TDJsonAdapter.Create; 297 | try 298 | fr.Adapter :=IAdp; 299 | fr.ReadFileToObject(SampleDataPath+'testcollection.Json',coll); 300 | checkequals(Coll.datacollectionName,'TestDataName'); 301 | Item :=Coll.DataItem[0]; 302 | 303 | checkequals(item.testString,'hello world'); 304 | checkequals(item.testInteger,28); 305 | CheckTrue(abs(item.testFloat-3.14)<=0.0000001,'float not equals'); 306 | checkequals(YearOf(item.testDate),yearOf(now)); 307 | 308 | finally 309 | FreeAndNil( Coll); 310 | end; 311 | 312 | end; 313 | 314 | procedure TestSearalizeObject.SetUp; 315 | begin 316 | FW :=TMyCustomWriter.Create(nil); 317 | Fr :=TMyCustomReader.Create(nil); 318 | end; 319 | 320 | procedure TestSearalizeObject.TearDown; 321 | begin 322 | FreeAndnil(Fr); 323 | FreeAndNil(FW); 324 | end; 325 | 326 | procedure TestSearalizeObject.TestReadfrmTest; 327 | var 328 | Iadp:IDataAdapter; 329 | frm:TfrmTest; 330 | begin 331 | iadp :=TDJsonAdapter.Create; 332 | frm :=TfrmTest.Create(nil); 333 | try 334 | fr.Adapter :=Iadp; 335 | fr.ReadFileToObject(SampleDataPath+'test.xml',frm) ; 336 | frm.ShowModal; 337 | finally 338 | FreeAndnil(frm); 339 | end; 340 | 341 | 342 | end; 343 | 344 | initialization 345 | // Register any test cases with the test runner 346 | registerTest(TestPascalSeralize.suite); 347 | RegisterTest(TestSearalizeObject.suite); 348 | RegisterClass(TDataItem); 349 | RegisterClass(TDataCollection); 350 | end. 351 | 352 | -------------------------------------------------------------------------------- /delphi_test/frm_test.dfm: -------------------------------------------------------------------------------- 1 | object frmTest: TfrmTest 2 | Left = 0 3 | Top = 0 4 | Caption = 'frmTest' 5 | ClientHeight = 231 6 | ClientWidth = 505 7 | Color = clBtnFace 8 | Font.Charset = DEFAULT_CHARSET 9 | Font.Color = clWindowText 10 | Font.Height = -11 11 | Font.Name = 'Tahoma' 12 | Font.Style = [] 13 | OldCreateOrder = False 14 | PixelsPerInch = 96 15 | TextHeight = 13 16 | object Image1: TImage 17 | Left = 328 18 | Top = 48 19 | Width = 105 20 | Height = 105 21 | end 22 | object Edit1: TEdit 23 | Left = 24 24 | Top = 24 25 | Width = 121 26 | Height = 21 27 | TabOrder = 0 28 | Text = 'aaaaaaaaaaa' 29 | end 30 | object Memo1: TMemo 31 | Left = 40 32 | Top = 112 33 | Width = 185 34 | Height = 89 35 | TabOrder = 1 36 | end 37 | end 38 | -------------------------------------------------------------------------------- /delphi_test/frm_test.pas: -------------------------------------------------------------------------------- 1 | unit frm_test; 2 | 3 | interface 4 | 5 | uses 6 | Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, 7 | Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, dxGDIPlusClasses, 8 | Vcl.StdCtrls; 9 | 10 | type 11 | TfrmTest = class(TForm) 12 | Image1: TImage; 13 | Edit1: TEdit; 14 | Memo1: TMemo; 15 | private 16 | { Private declarations } 17 | public 18 | { Public declarations } 19 | end; 20 | 21 | var 22 | frmTest: TfrmTest; 23 | 24 | implementation 25 | 26 | {$R *.dfm} 27 | 28 | end. 29 | -------------------------------------------------------------------------------- /delphi_test/testPascalObjectSeralize.dpr: -------------------------------------------------------------------------------- 1 | program testPascalObjectSeralize; 2 | { 3 | 4 | Delphi DUnit Test Project 5 | ------------------------- 6 | This project contains the DUnit test framework and the GUI/Console test runners. 7 | Add "CONSOLE_TESTRUNNER" to the conditional defines entry in the project options 8 | to use the console test runner. Otherwise the GUI test runner will be used by 9 | default. 10 | 11 | } 12 | 13 | {$IFDEF CONSOLE_TESTRUNNER} 14 | {$APPTYPE CONSOLE} 15 | {$ENDIF} 16 | 17 | uses 18 | DUnitTestRunner, 19 | Testpascalobject_seralize in 'Testpascalobject_seralize.pas', 20 | intf_seralizeadapter in '..\intf_seralizeadapter.pas', 21 | JsonDataObjects in '..\JsonDataObjects.pas', 22 | pascalobject_seralize in '..\pascalobject_seralize.pas', 23 | frm_test in 'frm_test.pas' {frmTest}, 24 | delphi_seralizeadapter in '..\delphi_seralizeadapter.pas'; 25 | 26 | {$R *.RES} 27 | 28 | begin 29 | {$IFDEF DEBUG} 30 | ReportMemoryLeaksOnShutdown :=true; 31 | {$ENDIF} 32 | DUnitTestRunner.RunRegisteredTests; 33 | end. 34 | 35 | -------------------------------------------------------------------------------- /delphi_test/testPascalObjectSeralize.dproj.local: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 2018/03/08 10:58:29.000.573,=E:\GitHub\PascalObjectSeralize\delphi_test\Testpascalobject_seralize.pas 5 | 2018/03/08 10:58:48.000.536,=E:\GitHub\PascalObjectSeralize\pascalobject_seralize.pas 6 | 2018/03/08 10:58:48.000.293,=E:\GitHub\PascalObjectSeralize\JsonDataObjects.pas 7 | 2018/03/08 10:58:48.000.096,=E:\GitHub\PascalObjectSeralize\intf_seralizeadapter.pas 8 | 2018/03/08 11:01:19.000.774,=E:\GitHub\PascalObjectSeralize\delphi_test\Unit1.pas 9 | 2018/03/08 11:01:31.000.644,E:\GitHub\PascalObjectSeralize\delphi_test\frm_test.pas=E:\GitHub\PascalObjectSeralize\delphi_test\Unit1.pas 10 | 2018/03/08 11:01:31.000.644,E:\GitHub\PascalObjectSeralize\delphi_test\frm_test.dfm=E:\GitHub\PascalObjectSeralize\delphi_test\Unit1.dfm 11 | 2018/03/08 11:03:24.000.533,=E:\GitHub\PascalObjectSeralize\delphi_seralizeadapter.pas 12 | 2018/03/09 07:50:25.000.553,E:\GitHub\PascalObjectSeralize\delphi_test\PascalObjectSeralize.dproj=E:\GitHub\PascalObjectSeralize\delphi_test\testPascalObjectSeralize.dproj 13 | 2018/03/11 10:37:45.000.974,=E:\GitHub\PascalObjectSeralize\fpc_seralizeadapter.pas 14 | 2018/03/11 10:47:00.000.178,E:\GitHub\PascalObjectSeralize\fpc_seralizeadapter.pas= 15 | 16 | 17 | -------------------------------------------------------------------------------- /delphi_test/testPascalObjectSeralize.identcache: -------------------------------------------------------------------------------- 1 | HE:\GitHub\PascalObjectSeralize\delphi_test\Testpascalobject_seralize.pasGE:\GitHub\PascalObjectSeralize\delphi_test\testPascalObjectSeralize.dpr8E:\GitHub\PascalObjectSeralize\pascalobject_seralize.pas7E:\GitHub\PascalObjectSeralize\intf_seralizeadapter.pas9E:\GitHub\PascalObjectSeralize\delphi_seralizeadapter.pas7E:\GitHub\PascalObjectSeralize\delphi_test\frm_test.pas2E:\GitHub\PascalObjectSeralize\JsonDataObjects.pas -------------------------------------------------------------------------------- /delphi_test/testPascalObjectSeralize.res: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ericwang1104/PascalObjectSeralize/911dcbd0a2ce84cdca8a14b0812758d0133e2ef4/delphi_test/testPascalObjectSeralize.res -------------------------------------------------------------------------------- /delphi_test/testPascalObjectSeralize.skincfg: -------------------------------------------------------------------------------- 1 | [ExpressSkins] 2 | Default=1 3 | ShowNotifications=1 4 | Enabled=1 5 | dxSkinBlack=0 6 | dxSkinBlue=0 7 | dxSkinBlueprint=0 8 | dxSkinCaramel=0 9 | dxSkinCoffee=0 10 | dxSkinDarkRoom=0 11 | dxSkinDarkSide=0 12 | dxSkinDevExpressDarkStyle=0 13 | dxSkinDevExpressStyle=0 14 | dxSkinFoggy=0 15 | dxSkinGlassOceans=0 16 | dxSkinHighContrast=0 17 | dxSkiniMaginary=0 18 | dxSkinLilian=0 19 | dxSkinLiquidSky=0 20 | dxSkinLondonLiquidSky=0 21 | dxSkinMcSkin=0 22 | dxSkinMetropolis=0 23 | dxSkinMetropolisDark=0 24 | dxSkinMoneyTwins=0 25 | dxSkinOffice2007Black=0 26 | dxSkinOffice2007Blue=0 27 | dxSkinOffice2007Green=0 28 | dxSkinOffice2007Pink=0 29 | dxSkinOffice2007Silver=0 30 | dxSkinOffice2010Black=0 31 | dxSkinOffice2010Blue=0 32 | dxSkinOffice2010Silver=0 33 | dxSkinOffice2013DarkGray=0 34 | dxSkinOffice2013LightGray=0 35 | dxSkinOffice2013White=1 36 | dxSkinOffice2016Colorful=1 37 | dxSkinOffice2016Dark=1 38 | dxSkinPumpkin=0 39 | dxSkinSeven=0 40 | dxSkinSevenClassic=0 41 | dxSkinSharp=0 42 | dxSkinSharpPlus=0 43 | dxSkinSilver=0 44 | dxSkinSpringTime=0 45 | dxSkinStardust=0 46 | dxSkinSummer2008=0 47 | dxSkinTheAsphaltWorld=0 48 | dxSkinsDefaultPainters=0 49 | dxSkinValentine=0 50 | dxSkinVisualStudio2013Blue=1 51 | dxSkinVisualStudio2013Dark=1 52 | dxSkinVisualStudio2013Light=1 53 | dxSkinVS2010=0 54 | dxSkinWhiteprint=0 55 | dxSkinXmas2008Blue=0 56 | -------------------------------------------------------------------------------- /delphi_test/testPascalObjectSeralize.stat: -------------------------------------------------------------------------------- 1 | [Stats] 2 | EditorSecs=5335 3 | DesignerSecs=75 4 | InspectorSecs=98 5 | CompileSecs=141482 6 | OtherSecs=1581 7 | StartTime=2018/3/9 8:57:54 8 | RealKeys=0 9 | EffectiveKeys=0 10 | DebugSecs=2616 11 | -------------------------------------------------------------------------------- /fpc_seralizeadapter.pas: -------------------------------------------------------------------------------- 1 | unit fpc_seralizeadapter; 2 | {$mode objfpc}{$H+} 3 | interface 4 | 5 | uses 6 | Classes, SysUtils, variants, 7 | fpjson, dbugintf,Laz_XMLRead, Laz2_DOM, Laz_XMLWrite, 8 | intf_seralizeadapter; 9 | type 10 | 11 | { TFPCXmlNode } 12 | TFPCXmlNode=class(TInterfacedObject,IDataNode) 13 | 14 | 15 | function GetAttributes(Name: string): string; 16 | function GetChildItem(Index:integer): IDataNode; 17 | function GetNodeName: string; 18 | function GetValue: variant; 19 | procedure SetAttributes(Name: string; AValue: string); 20 | procedure SetNodeName(AValue: string); 21 | procedure SetValue(AValue: variant); 22 | function AddChild():IDataNode; 23 | function ChildCount:integer; 24 | procedure SetData(AValue: string); 25 | function AddPropObj(const Name: string): IDataNode; 26 | function PropObjByName(const Name:string): IDataNode; 27 | function GetData: string; 28 | function GetDumpText:string; 29 | protected 30 | fDoc:TDOMDocument; 31 | fNode:TDOMNode; 32 | function BuilDataNode(const Node:TDOMNode):IDataNode; 33 | end; 34 | {TFPCJsonNode=class(TInterfacedObject,IDataNode) 35 | 36 | end;} 37 | 38 | 39 | { TFPCXmlAdapter } 40 | 41 | TFPCXmlAdapter=class(TInterfacedObject,IDataAdapter) 42 | 43 | 44 | 45 | function NewDoc:IDataNode; 46 | function GetRootNode:IDataNode; 47 | procedure LoadFromFile(const Filename:string); 48 | procedure SaveToFile(const FileName:string); 49 | function GetSeralzieString: string; 50 | private 51 | fDoc:TXMLDocument; 52 | public 53 | destructor Destroy;override; 54 | 55 | end; 56 | TFPCJsonNode=class(TInterfacedObject,IDataNode) 57 | function GetAttributes(Name: string): string; 58 | function GetChildItem(Index:integer): IDataNode; 59 | function GetNodeName: string; 60 | function GetValue: variant; 61 | procedure SetAttributes(Name: string; AValue: string); 62 | procedure SetNodeName(AValue: string); 63 | procedure SetValue(AValue: variant); 64 | function AddChild():IDataNode; 65 | function ChildCount:integer; 66 | procedure SetData(AValue: string); 67 | function GetData: string; 68 | function AddPropObj(const Name: string): IDataNode; 69 | function PropObjByName(const Name:string): IDataNode; 70 | function GetDumpText:string; 71 | protected 72 | fDoc:TJsonObject; 73 | fNode:TJSOnData; 74 | FParent:TJsonObject; 75 | function BuilDataNode(const Node:TJsonData):IDataNode; 76 | end; 77 | 78 | { TFPCJsonAdapter } 79 | 80 | TFPCJsonAdapter=class(TInterfacedObject,IDataAdapter) 81 | function NewDoc:IDataNode; 82 | function GetRootNode:IDataNode; 83 | procedure LoadFromFile(const Filename:string); 84 | procedure SaveToFile(const FileName:string); 85 | function GetSeralzieString: string; 86 | private 87 | fDoc:TJsonObject; 88 | public 89 | destructor Destroy;override; 90 | end; 91 | implementation 92 | 93 | { TFPCJsonNode } 94 | 95 | function TFPCJsonNode.GetAttributes(Name: string): string; 96 | begin 97 | if FNode is TJSonData then 98 | begin 99 | result :=(FNode as TJsonObject).Get(LowerCase(Name)); 100 | end else 101 | begin 102 | assert(false,'fnode is not a object'); 103 | end; 104 | end; 105 | 106 | function TFPCJsonNode.GetChildItem(Index: integer): IDataNode; 107 | var 108 | Item:TJsonObject; 109 | Count:integer; 110 | JObj:TJsonObject; 111 | Arr:TJSONArray; 112 | begin 113 | JObj :=FNode as TJsonObject; 114 | Arr :=JObj.Arrays['ITEMS']; 115 | Item :=Arr.Objects[Index]; 116 | result :=BuilDataNode(Item); 117 | end; 118 | 119 | function TFPCJsonNode.GetNodeName: string; 120 | var 121 | Index:integer; 122 | begin 123 | Index :=FParent.IndexOf(FNode); 124 | result :=FParent.Names[Index]; 125 | 126 | end; 127 | 128 | function TFPCJsonNode.GetValue: variant; 129 | begin 130 | result :=FNode.Value; 131 | end; 132 | 133 | procedure TFPCJsonNode.SetAttributes(Name: string; AValue: string); 134 | var 135 | JD:TJSOnData; 136 | Jobj:TJsonObject; 137 | begin 138 | if FNode is TJsonObject then 139 | begin 140 | JObj :=FNode as TJsonObject; 141 | JD :=Jobj.Find(LowerCase(Name)); 142 | if not Assigned(JD)then 143 | begin 144 | (FNode as TJsonObject).Add(LowerCase(Name),AValue); 145 | end else 146 | begin 147 | jd.AsString:=AValue; 148 | end; 149 | end; 150 | end; 151 | 152 | procedure TFPCJsonNode.SetNodeName(AValue: string); 153 | begin 154 | (FNode as TJsonObject).Find('name').Value :=AVAlue; 155 | end; 156 | 157 | procedure TFPCJsonNode.SetValue(AValue: variant); 158 | 159 | begin 160 | FNode.Value:=AValue; 161 | 162 | end; 163 | 164 | function TFPCJsonNode.AddChild(): IDataNode; 165 | var 166 | JObj:TJsonObject; 167 | Child:TJsonObject; 168 | JNode:TFPCJsonNode; 169 | JArr:TJSONArray; 170 | begin 171 | JObj :=FNode as TJsonObject; 172 | if not JObj.Find('ITEMS',JArr) then 173 | begin 174 | JArr :=TJSONArray.Create; 175 | JObj.Add('ITEMS',JArr); 176 | end; 177 | 178 | Child :=TJsonObject.Create(); 179 | JArr.Add(Child); 180 | result :=BuilDataNode(Child); 181 | end; 182 | 183 | function TFPCJsonNode.ChildCount: integer; 184 | var 185 | JObj:TJsonObject; 186 | Arr:TJSONArray; 187 | begin 188 | JObj :=fNode as TJsonObject; 189 | Arr :=Jobj.Arrays['ITEMS']; 190 | result :=Arr.Count; 191 | end; 192 | 193 | 194 | 195 | procedure TFPCJsonNode.SetData(AValue: string); 196 | begin 197 | (FNode as TJSonObject).Add('cdata',AValue); 198 | end; 199 | 200 | function TFPCJsonNode.GetData: string; 201 | begin 202 | result :=(FNode as TJsonObject).Get('cdata'); 203 | end; 204 | 205 | function TFPCJsonNode.AddPropObj(const Name: string): IDataNode; 206 | var 207 | JObj,Child:TJsonObject; 208 | begin 209 | 210 | JObj :=FNode as TJsonObject; 211 | Child :=TJsonObject.Create; 212 | Jobj.Add(Name,Child); 213 | Result :=self.BuilDataNode(child); 214 | 215 | end; 216 | 217 | function TFPCJsonNode.PropObjByName(const Name: string): IDataNode; 218 | var 219 | JObj,PropObj :TJsonObject; 220 | begin 221 | JObj :=FNode as TJsonObject; 222 | if JObj.Find(LowerCase(Name),PropObj) then 223 | begin 224 | result :=BuilDataNode(PropObj); 225 | end else 226 | begin 227 | result :=nil; 228 | end; 229 | end; 230 | 231 | function TFPCJsonNode.GetDumpText: string; 232 | begin 233 | result :=FNode.AsJSON; 234 | end; 235 | 236 | 237 | 238 | 239 | 240 | function TFPCJsonNode.BuilDataNode(const Node: TJsonData): IDataNode; 241 | var 242 | JNode:TFPCJsonNode; 243 | begin 244 | JNode :=TFPCJsonNode.Create; 245 | JNode.fDoc :=self.fDoc; 246 | JNode.fNode :=Node; 247 | JNode.FParent :=FNode as TJsonObject; 248 | result :=JNode; 249 | end; 250 | 251 | { TFPCJsonAdapter } 252 | 253 | function TFPCJsonAdapter.NewDoc: IDataNode; 254 | begin 255 | Fdoc :=GetJson('{JSONOBJECT:{}}') as TJsonObject; 256 | end; 257 | 258 | function TFPCJsonAdapter.GetRootNode: IDataNode; 259 | var 260 | Node:TFPCJsonNode; 261 | JObj:TJsonObject; 262 | begin 263 | JObj :=FDoc.Find('JSONOBJECT') as TJsonObject; 264 | Node :=TFPCJsonNode.Create; 265 | Node.fNode :=JObj; 266 | Node.FParent :=FDoc; 267 | Node.fDoc :=fDOc; 268 | result :=Node; 269 | end; 270 | 271 | procedure TFPCJsonAdapter.LoadFromFile(const Filename: string); 272 | var 273 | FS:TFileStream; 274 | begin 275 | FS :=TFileStream.Create(FileName,fmopenRead); 276 | try 277 | FS.Position:=0; 278 | if not Assigned(Fdoc) then FreeAndNil(FDoc); 279 | FDoc :=GetJson(FS) as TJsonObject; 280 | finally 281 | FreeAndNil(FS); 282 | end; 283 | end; 284 | 285 | procedure TFPCJsonAdapter.SaveToFile(const FileName: string); 286 | var 287 | FS:TFileStream; 288 | begin 289 | FS :=TFileStream.Create(FileName,fmcreate); 290 | try 291 | //FDoc.FormatJSON([foUseTabchar,foSkipWhiteSpace]); 292 | FDoc.FormatJSON(DefaultFormat); 293 | Fdoc.DumpJSON(FS); 294 | 295 | finally 296 | FreeAndNil(FS); 297 | end; 298 | end; 299 | 300 | function TFPCJsonAdapter.GetSeralzieString: string; 301 | begin 302 | result :=fdoc.AsString; 303 | end; 304 | 305 | destructor TFPCJsonAdapter.Destroy; 306 | begin 307 | if Assigned(FDoc) then 308 | FreeAndNil(FDoc); 309 | inherited ; 310 | end; 311 | 312 | { TFPCXmlNode } 313 | 314 | function TFPCXmlNode.BuilDataNode(const Node: TDOMNode): IDataNode; 315 | var 316 | xmlNode:TFPCXmlNode; 317 | begin 318 | xmlNode :=TFpcXmlNode.Create; 319 | xmlNode.fDoc :=self.fDoc; 320 | xmlnode.fNode :=Node; 321 | result :=xmlNode; 322 | 323 | end; 324 | 325 | function TFPCXmlNode.GetAttributes(Name: string): string; 326 | begin 327 | result :=fNode.Attributes.GetNamedItem(Name).NodeValue; 328 | end; 329 | 330 | function TFPCXmlNode.GetChildItem(Index: integer): IDataNode; 331 | var 332 | Node:TDOMNode; 333 | begin 334 | //result :=fNode.ChildNodes[Index]; 335 | Node :=fNode.ChildNodes[Index]; 336 | result :=self.BuilDataNode(Node); 337 | end; 338 | 339 | function TFPCXmlNode.GetNodeName: string; 340 | begin 341 | result :=fNode.NodeName; 342 | end; 343 | 344 | function TFPCXmlNode.GetValue: variant; 345 | begin 346 | result :=fNode.NodeValue; 347 | end; 348 | 349 | procedure TFPCXmlNode.SetAttributes(Name: string; AValue: string); 350 | var 351 | attr:TDOMNode; 352 | begin 353 | attr :=FNode.Attributes.GetNamedItem(Name); 354 | if Assigned(Attr) then 355 | begin 356 | attr.NodeValue:=AValue; 357 | end else 358 | begin 359 | if fNode is TDOMElement then 360 | begin 361 | (fNode as TDOMElement).SetAttribute(Name,AValue); 362 | end else 363 | begin 364 | assert(false,'this nod is not a element node'); 365 | end; 366 | end; 367 | end; 368 | 369 | procedure TFPCXmlNode.SetNodeName(AValue: string); 370 | begin 371 | // 372 | end; 373 | 374 | procedure TFPCXmlNode.SetValue(AValue: variant); 375 | begin 376 | fNode.NodeValue :=VarTostr(AValue); 377 | end; 378 | 379 | 380 | 381 | 382 | function TFPCXmlNode.AddChild(): IDataNode; 383 | var 384 | Ele:TDomElement; 385 | begin 386 | Ele :=FDoc.CreateElement('ITEM'); 387 | fNode.AppendChild(Ele); 388 | result :=self.BuilDataNode(Ele); 389 | end; 390 | 391 | function TFPCXmlNode.ChildCount: integer; 392 | begin 393 | result :=FNode.ChildNodes.Count; 394 | end; 395 | 396 | 397 | 398 | procedure TFPCXmlNode.SetData(AValue: string); 399 | var 400 | xmlNode :TFPCXmlNode; 401 | CData:TDOMCDataSection; 402 | begin 403 | CData :=fDoc.CreateCDATASection(AVAlue); 404 | fNode.AppendChild(CData); 405 | 406 | 407 | end; 408 | 409 | function TFPCXmlNode.AddPropObj(const Name: string): IDataNode; 410 | var 411 | Ele:TDOMElement; 412 | begin 413 | Ele :=FDoc.CreateElement(Name); 414 | FNode.AppendChild(Ele); 415 | Result :=self.BuilDataNode(Ele); 416 | 417 | end; 418 | 419 | function TFPCXmlNode.PropObjByName(const Name: string): IDataNode; 420 | var 421 | Node:TDOMNode; 422 | begin 423 | {JObj :=FJSon.O[Name]; 424 | if Assigned(JObj) then 425 | begin 426 | result :=BuildDataNode(JObj) 427 | end else 428 | begin 429 | result :=nil; 430 | end; } 431 | Node :=FDoc.FindNode(Name); 432 | if Assigned(Node) then 433 | begin 434 | result :=self.BuilDataNode(Node); 435 | end else 436 | begin 437 | result :=nil; 438 | end; 439 | end; 440 | 441 | function TFPCXmlNode.GetData: string; 442 | begin 443 | result :=FNode.FindNode('#cdata-section').NodeValue; 444 | end; 445 | 446 | function TFPCXmlNode.GetDumpText: string; 447 | begin 448 | result :=self.fNode.TextContent; 449 | end; 450 | 451 | 452 | 453 | { TFPCXmlAdapter } 454 | 455 | destructor TFPCXmlAdapter.Destroy; 456 | begin 457 | if Assigned(fDoc) then 458 | FreeAndNil(fDoc); 459 | inherited ; 460 | end; 461 | 462 | function TFPCXmlAdapter.NewDoc: IDataNode; 463 | var 464 | Element:TDomElement; 465 | begin 466 | if Assigned(fDoc) then 467 | begin 468 | FreeAndNil(fDoc); 469 | end; 470 | fDoc :=TXMLDocument.Create; 471 | Element :=fdoc.CreateElement('XMLObject'); 472 | Fdoc.AppendChild(Element); 473 | end; 474 | 475 | function TFPCXmlAdapter.GetRootNode: IDataNode; 476 | var 477 | xmlNode:TFPCXmlNode; 478 | begin 479 | xmlNode :=TFPCXmlNode.Create; 480 | xmlNode.fNode :=fDoc.FirstChild; 481 | xmlNode.fDoc :=fDoc; 482 | result :=xmlNode; 483 | end; 484 | 485 | procedure TFPCXmlAdapter.LoadFromFile(const Filename: string); 486 | begin 487 | // 488 | ReadXMLFile(fDoc,FileName); 489 | end; 490 | 491 | procedure TFPCXmlAdapter.SaveToFile(const FileName: string); 492 | begin 493 | 494 | WriteXML(fDoc,FileName); 495 | end; 496 | 497 | function TFPCXmlAdapter.GetSeralzieString: string; 498 | begin 499 | WriteXML(FDoc,result); 500 | end; 501 | 502 | 503 | 504 | end. 505 | 506 | -------------------------------------------------------------------------------- /intf_seralizeadapter.pas: -------------------------------------------------------------------------------- 1 | unit intf_seralizeadapter; 2 | {$IFDEF PFC} 3 | {$mode objfpc}{$H+} 4 | {$ENDIF} 5 | interface 6 | 7 | uses 8 | Classes, SysUtils; 9 | const 10 | DATA_NODE_INTERFACE='{33427852-44EE-4EA8-A339-29C082DF3499}'; 11 | Data_ADAPTER_INTERFACE='{69CFA652-6127-45FC-934E-FD48871E33DF}'; 12 | type 13 | { TDataNode } 14 | 15 | { IDataNode } 16 | 17 | IDataNode=Interface(IInterface) 18 | [DATA_NODE_INTERFACE] 19 | function GetAttributes(Name: string): string; 20 | function GetChildItem(Index:integer): IDataNode; 21 | function GetDumpText: string; 22 | function GetNodeName: string; 23 | function GetValue: variant; 24 | procedure SetAttributes(Name: string; AValue: string); 25 | procedure SetNodeName(AValue: string); 26 | procedure SetValue(AValue: variant); 27 | function AddChild():IDataNode; 28 | function AddPropObj(const Name: string): IDataNode; 29 | function ChildCount:integer; 30 | function PropObjByName(const Name:string): IDataNode; 31 | procedure SetData(AValue: string); 32 | function GetData: string; 33 | 34 | Property ChildItem[Index:integer]:IDataNode read GetChildItem; 35 | Property DATA:string read GetData write SetData; 36 | property NodeName:string read GetNodeName write SetNodeName; 37 | property Value:variant read GetValue write SetValue; 38 | property Attributes[Name:string]:string read GetAttributes write SetAttributes; 39 | property DumpText:string read GetDumpText; 40 | end; 41 | 42 | { IDataAdapter } 43 | 44 | IDataAdapter=interface(IInterface) 45 | [Data_ADAPTER_INTERFACE] 46 | function NewDoc:IDataNode; 47 | function GetRootNode: IDataNode; 48 | function GetSeralzieString: string; 49 | procedure LoadFromFile(const FileName:string); 50 | procedure SaveToFile(const FileName:string); 51 | property RootNode:IDataNode read GetRootNode; 52 | end; 53 | 54 | 55 | 56 | implementation 57 | 58 | 59 | 60 | { TDataNode } 61 | 62 | 63 | 64 | end. 65 | 66 | -------------------------------------------------------------------------------- /pascalobject_seralize.pas: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ericwang1104/PascalObjectSeralize/911dcbd0a2ce84cdca8a14b0812758d0133e2ef4/pascalobject_seralize.pas -------------------------------------------------------------------------------- /test/backup/frm_test.lfm: -------------------------------------------------------------------------------- 1 | object frmTest: TfrmTest 2 | Left = 389 3 | Height = 373 4 | Top = 137 5 | Width = 427 6 | AllowDropFiles = True 7 | Caption = 'Action1' 8 | ClientHeight = 373 9 | ClientWidth = 427 10 | OnCreate = FormCreate 11 | LCLVersion = '1.6.4.0' 12 | object Image1: TImage 13 | Left = 16 14 | Height = 178 15 | Top = 24 16 | Width = 322 17 | end 18 | object Button1: TButton 19 | Left = 16 20 | Height = 25 21 | Top = 232 22 | Width = 75 23 | Action = actTest 24 | TabOrder = 0 25 | end 26 | object ActionList1: TActionList 27 | left = 335 28 | top = 233 29 | object actTest: TAction 30 | Caption = 'Action1' 31 | OnExecute = actTestExecute 32 | end 33 | end 34 | end 35 | -------------------------------------------------------------------------------- /test/backup/pascalobject_seralize_test.lpi: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | <ResourceType Value="res"/> 11 | <UseXPManifest Value="True"/> 12 | <Icon Value="0"/> 13 | </General> 14 | <i18n> 15 | <EnableI18N LFM="False"/> 16 | </i18n> 17 | <VersionInfo> 18 | <StringTable ProductVersion=""/> 19 | </VersionInfo> 20 | <BuildModes Count="2"> 21 | <Item1 Name="Debug" Default="True"/> 22 | <Item2 Name="Release"> 23 | <CompilerOptions> 24 | <Version Value="11"/> 25 | <PathDelim Value="\"/> 26 | <SearchPaths> 27 | <IncludeFiles Value="$(ProjOutDir)"/> 28 | <OtherUnitFiles Value=".."/> 29 | </SearchPaths> 30 | <CodeGeneration> 31 | <SmartLinkUnit Value="True"/> 32 | <Optimizations> 33 | <OptimizationLevel Value="3"/> 34 | </Optimizations> 35 | </CodeGeneration> 36 | <Linking> 37 | <Debugging> 38 | <GenerateDebugInfo Value="False"/> 39 | </Debugging> 40 | <LinkSmart Value="True"/> 41 | <Options> 42 | <Win32> 43 | <GraphicApplication Value="True"/> 44 | </Win32> 45 | </Options> 46 | </Linking> 47 | </CompilerOptions> 48 | </Item2> 49 | </BuildModes> 50 | <PublishOptions> 51 | <Version Value="2"/> 52 | </PublishOptions> 53 | <RunParams> 54 | <local> 55 | <FormatVersion Value="1"/> 56 | </local> 57 | </RunParams> 58 | <RequiredPackages Count="3"> 59 | <Item1> 60 | <PackageName Value="LCL"/> 61 | </Item1> 62 | <Item2> 63 | <PackageName Value="fpcunittestrunner"/> 64 | </Item2> 65 | <Item3> 66 | <PackageName Value="fpcunitide"/> 67 | </Item3> 68 | </RequiredPackages> 69 | <Units Count="7"> 70 | <Unit0> 71 | <Filename Value="pascalobject_seralize_test.lpr"/> 72 | <IsPartOfProject Value="True"/> 73 | </Unit0> 74 | <Unit1> 75 | <Filename Value="..\fpc_seralizeadapter.pas"/> 76 | <IsPartOfProject Value="True"/> 77 | </Unit1> 78 | <Unit2> 79 | <Filename Value="..\intf_seralizeadapter.pas"/> 80 | <IsPartOfProject Value="True"/> 81 | </Unit2> 82 | <Unit3> 83 | <Filename Value="..\pascalobject_seralize.pas"/> 84 | <IsPartOfProject Value="True"/> 85 | </Unit3> 86 | <Unit4> 87 | <Filename Value="testfpc_seralizeadapter_test.pas"/> 88 | <IsPartOfProject Value="True"/> 89 | </Unit4> 90 | <Unit5> 91 | <Filename Value="test_pascalobjectseralize.pas"/> 92 | <IsPartOfProject Value="True"/> 93 | </Unit5> 94 | <Unit6> 95 | <Filename Value="frm_test.pas"/> 96 | <IsPartOfProject Value="True"/> 97 | <ComponentName Value="frmTest"/> 98 | <HasResources Value="True"/> 99 | <ResourceBaseClass Value="Form"/> 100 | <UnitName Value="frm_Test"/> 101 | </Unit6> 102 | </Units> 103 | </ProjectOptions> 104 | <CompilerOptions> 105 | <Version Value="11"/> 106 | <PathDelim Value="\"/> 107 | <SearchPaths> 108 | <IncludeFiles Value="$(ProjOutDir)"/> 109 | <OtherUnitFiles Value=".."/> 110 | </SearchPaths> 111 | <Parsing> 112 | <SyntaxOptions> 113 | <IncludeAssertionCode Value="True"/> 114 | </SyntaxOptions> 115 | </Parsing> 116 | <CodeGeneration> 117 | <Checks> 118 | <IOChecks Value="True"/> 119 | <RangeChecks Value="True"/> 120 | <OverflowChecks Value="True"/> 121 | <StackChecks Value="True"/> 122 | </Checks> 123 | <VerifyObjMethodCallValidity Value="True"/> 124 | </CodeGeneration> 125 | <Linking> 126 | <Debugging> 127 | <DebugInfoType Value="dsDwarf2Set"/> 128 | <UseHeaptrc Value="True"/> 129 | <TrashVariables Value="True"/> 130 | <UseExternalDbgSyms Value="True"/> 131 | </Debugging> 132 | <Options> 133 | <Win32> 134 | <GraphicApplication Value="True"/> 135 | </Win32> 136 | </Options> 137 | </Linking> 138 | </CompilerOptions> 139 | <Debugging> 140 | <Exceptions Count="3"> 141 | <Item1> 142 | <Name Value="EAbort"/> 143 | </Item1> 144 | <Item2> 145 | <Name Value="ECodetoolError"/> 146 | </Item2> 147 | <Item3> 148 | <Name Value="EFOpenError"/> 149 | </Item3> 150 | </Exceptions> 151 | </Debugging> 152 | </CONFIG> 153 | -------------------------------------------------------------------------------- /test/backup/pascalobject_seralize_test.lpr: -------------------------------------------------------------------------------- 1 | program pascalobject_seralize_test; 2 | 3 | {$mode objfpc}{$H+} 4 | uses 5 | Interfaces, Forms,GuiTestRunner, testfpc_seralizeadapter_test, 6 | test_pascalobjectseralize, frm_Test; 7 | 8 | {$R *.res} 9 | 10 | begin 11 | Application.Initialize; 12 | Application.CreateForm(TGuiTestRunner, TestRunner); 13 | Application.CreateForm(TfrmTest, frmTest); 14 | Application.Run; 15 | end. 16 | 17 | -------------------------------------------------------------------------------- /test/backup/pascalobject_seralize_test.lps: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <CONFIG> 3 | <ProjectSession> 4 | <PathDelim Value="\"/> 5 | <Version Value="10"/> 6 | <BuildModes Active="Debug"/> 7 | <Units Count="29"> 8 | <Unit0> 9 | <Filename Value="pascalobject_seralize_test.lpr"/> 10 | <IsPartOfProject Value="True"/> 11 | <EditorIndex Value="8"/> 12 | <CursorPos X="68"/> 13 | <UsageCount Value="70"/> 14 | <Loaded Value="True"/> 15 | </Unit0> 16 | <Unit1> 17 | <Filename Value="..\fpc_seralizeadapter.pas"/> 18 | <IsPartOfProject Value="True"/> 19 | <IsVisibleTab Value="True"/> 20 | <TopLine Value="197"/> 21 | <CursorPos X="39" Y="208"/> 22 | <UsageCount Value="70"/> 23 | <Bookmarks Count="1"> 24 | <Item0 X="22" Y="138" ID="1"/> 25 | </Bookmarks> 26 | <Loaded Value="True"/> 27 | </Unit1> 28 | <Unit2> 29 | <Filename Value="..\intf_seralizeadapter.pas"/> 30 | <IsPartOfProject Value="True"/> 31 | <EditorIndex Value="7"/> 32 | <TopLine Value="21"/> 33 | <CursorPos X="14" Y="32"/> 34 | <UsageCount Value="70"/> 35 | <Loaded Value="True"/> 36 | </Unit2> 37 | <Unit3> 38 | <Filename Value="..\pascalobject_seralize.pas"/> 39 | <IsPartOfProject Value="True"/> 40 | <EditorIndex Value="6"/> 41 | <TopLine Value="399"/> 42 | <CursorPos X="34" Y="414"/> 43 | <UsageCount Value="70"/> 44 | <Bookmarks Count="2"> 45 | <Item0 X="15" Y="237" ID="3"/> 46 | <Item1 X="8" Y="599" ID="2"/> 47 | </Bookmarks> 48 | <Loaded Value="True"/> 49 | </Unit3> 50 | <Unit4> 51 | <Filename Value="testfpc_seralizeadapter_test.pas"/> 52 | <IsPartOfProject Value="True"/> 53 | <EditorIndex Value="2"/> 54 | <TopLine Value="65"/> 55 | <CursorPos X="36" Y="77"/> 56 | <UsageCount Value="70"/> 57 | <Loaded Value="True"/> 58 | </Unit4> 59 | <Unit5> 60 | <Filename Value="test_pascalobjectseralize.pas"/> 61 | <IsPartOfProject Value="True"/> 62 | <EditorIndex Value="4"/> 63 | <TopLine Value="268"/> 64 | <CursorPos Y="279"/> 65 | <UsageCount Value="61"/> 66 | <Loaded Value="True"/> 67 | </Unit5> 68 | <Unit6> 69 | <Filename Value="frm_test.pas"/> 70 | <IsPartOfProject Value="True"/> 71 | <ComponentName Value="frmTest"/> 72 | <HasResources Value="True"/> 73 | <ResourceBaseClass Value="Form"/> 74 | <UnitName Value="frm_Test"/> 75 | <EditorIndex Value="5"/> 76 | <CursorPos X="22" Y="16"/> 77 | <UsageCount Value="57"/> 78 | <Loaded Value="True"/> 79 | <LoadedDesigner Value="True"/> 80 | </Unit6> 81 | <Unit7> 82 | <Filename Value="..\testxmlpersistent.pas"/> 83 | <EditorIndex Value="-1"/> 84 | <TopLine Value="13"/> 85 | <CursorPos X="3" Y="11"/> 86 | <UsageCount Value="55"/> 87 | </Unit7> 88 | <Unit8> 89 | <Filename Value="testcase1.pas"/> 90 | <UnitName Value="TestCase1"/> 91 | <EditorIndex Value="-1"/> 92 | <UsageCount Value="15"/> 93 | </Unit8> 94 | <Unit9> 95 | <Filename Value="C:\lazarus\components\fpcunit\guitestrunner.pas"/> 96 | <ComponentName Value="GUITestRunner"/> 97 | <HasResources Value="True"/> 98 | <ResourceBaseClass Value="Form"/> 99 | <UnitName Value="GuiTestRunner"/> 100 | <EditorIndex Value="-1"/> 101 | <TopLine Value="25"/> 102 | <CursorPos X="32" Y="39"/> 103 | <UsageCount Value="5"/> 104 | </Unit9> 105 | <Unit10> 106 | <Filename Value="C:\lazarus\components\lazutils\laz2_dom.pas"/> 107 | <UnitName Value="Laz2_DOM"/> 108 | <EditorIndex Value="-1"/> 109 | <TopLine Value="269"/> 110 | <CursorPos X="25" Y="286"/> 111 | <UsageCount Value="17"/> 112 | </Unit10> 113 | <Unit11> 114 | <Filename Value="C:\lazarus\fpc\3.0.2\source\rtl\inc\objpash.inc"/> 115 | <EditorIndex Value="-1"/> 116 | <TopLine Value="182"/> 117 | <CursorPos X="23" Y="193"/> 118 | <UsageCount Value="5"/> 119 | </Unit11> 120 | <Unit12> 121 | <Filename Value="C:\lazarus\components\lazutils\laz_xmlwrite.pas"/> 122 | <UnitName Value="Laz_XMLWrite"/> 123 | <EditorIndex Value="-1"/> 124 | <TopLine Value="10"/> 125 | <CursorPos X="3" Y="50"/> 126 | <UsageCount Value="13"/> 127 | </Unit12> 128 | <Unit13> 129 | <Filename Value="C:\lazarus\components\lazutils\laz2_xmlwrite.pas"/> 130 | <UnitName Value="laz2_XMLWrite"/> 131 | <EditorIndex Value="-1"/> 132 | <TopLine Value="349"/> 133 | <CursorPos X="17" Y="798"/> 134 | <UsageCount Value="13"/> 135 | </Unit13> 136 | <Unit14> 137 | <Filename Value="C:\lazarus\fpc\3.0.2\source\packages\rtl-objpas\src\inc\variants.pp"/> 138 | <EditorIndex Value="-1"/> 139 | <TopLine Value="2995"/> 140 | <CursorPos X="3" Y="2998"/> 141 | <UsageCount Value="10"/> 142 | </Unit14> 143 | <Unit15> 144 | <Filename Value="C:\lazarus\fpc\3.0.2\source\rtl\inc\varianth.inc"/> 145 | <EditorIndex Value="-1"/> 146 | <TopLine Value="109"/> 147 | <CursorPos X="31" Y="123"/> 148 | <UsageCount Value="10"/> 149 | </Unit15> 150 | <Unit16> 151 | <Filename Value="C:\lazarus\fpc\3.0.2\source\packages\fcl-base\src\base64.pp"/> 152 | <EditorIndex Value="-1"/> 153 | <TopLine Value="31"/> 154 | <CursorPos X="26" Y="43"/> 155 | <UsageCount Value="8"/> 156 | </Unit16> 157 | <Unit17> 158 | <Filename Value="C:\lazarus\fpc\3.0.2\source\rtl\objpas\classes\classesh.inc"/> 159 | <EditorIndex Value="1"/> 160 | <TopLine Value="64"/> 161 | <CursorPos X="25" Y="67"/> 162 | <UsageCount Value="21"/> 163 | <Loaded Value="True"/> 164 | </Unit17> 165 | <Unit18> 166 | <Filename Value="C:\lazarus\fpc\3.0.2\source\rtl\objpas\classes\cregist.inc"/> 167 | <EditorIndex Value="-1"/> 168 | <TopLine Value="111"/> 169 | <CursorPos X="10" Y="122"/> 170 | <UsageCount Value="8"/> 171 | </Unit18> 172 | <Unit19> 173 | <Filename Value="C:\lazarus\components\lazutils\laz_xmlread.pas"/> 174 | <UnitName Value="Laz_XMLRead"/> 175 | <EditorIndex Value="-1"/> 176 | <TopLine Value="5"/> 177 | <CursorPos X="11" Y="16"/> 178 | <UsageCount Value="7"/> 179 | </Unit19> 180 | <Unit20> 181 | <Filename Value="C:\lazarus\components\lazutils\laz2_xmlread.pas"/> 182 | <UnitName Value="laz2_XMLRead"/> 183 | <EditorIndex Value="-1"/> 184 | <TopLine Value="1698"/> 185 | <CursorPos X="30" Y="1700"/> 186 | <UsageCount Value="7"/> 187 | </Unit20> 188 | <Unit21> 189 | <Filename Value="C:\lazarus\fpc\3.0.2\source\rtl\objpas\typinfo.pp"/> 190 | <EditorIndex Value="-1"/> 191 | <TopLine Value="256"/> 192 | <CursorPos X="26" Y="280"/> 193 | <UsageCount Value="18"/> 194 | </Unit21> 195 | <Unit22> 196 | <Filename Value="frm_test.lfm"/> 197 | <EditorIndex Value="-1"/> 198 | <CursorPos X="9" Y="10"/> 199 | <UsageCount Value="7"/> 200 | <DefaultSyntaxHighlighter Value="LFM"/> 201 | </Unit22> 202 | <Unit23> 203 | <Filename Value="C:\lazarus\fpc\3.0.2\source\rtl\objpas\classes\streams.inc"/> 204 | <EditorIndex Value="-1"/> 205 | <TopLine Value="448"/> 206 | <CursorPos X="5" Y="454"/> 207 | <UsageCount Value="15"/> 208 | </Unit23> 209 | <Unit24> 210 | <Filename Value="C:\lazarus\lcl\forms.pp"/> 211 | <UnitName Value="Forms"/> 212 | <EditorIndex Value="-1"/> 213 | <TopLine Value="774"/> 214 | <CursorPos X="22" Y="774"/> 215 | <UsageCount Value="15"/> 216 | </Unit24> 217 | <Unit25> 218 | <Filename Value="C:\lazarus\lcl\controls.pp"/> 219 | <UnitName Value="Controls"/> 220 | <EditorIndex Value="-1"/> 221 | <TopLine Value="1633"/> 222 | <CursorPos X="30" Y="1635"/> 223 | <UsageCount Value="15"/> 224 | </Unit25> 225 | <Unit26> 226 | <Filename Value="C:\lazarus\fpc\3.0.2\source\packages\fcl-json\src\fpjson.pp"/> 227 | <EditorIndex Value="3"/> 228 | <TopLine Value="2451"/> 229 | <CursorPos X="3" Y="2453"/> 230 | <UsageCount Value="17"/> 231 | <Loaded Value="True"/> 232 | </Unit26> 233 | <Unit27> 234 | <Filename Value="C:\lazarus\fpc\3.0.2\source\packages\fcl-json\src\jsonparser.pp"/> 235 | <EditorIndex Value="-1"/> 236 | <TopLine Value="127"/> 237 | <CursorPos X="3" Y="129"/> 238 | <UsageCount Value="10"/> 239 | </Unit27> 240 | <Unit28> 241 | <Filename Value="C:\lazarus\fpc\3.0.2\source\packages\fcl-base\src\contnrs.pp"/> 242 | <EditorIndex Value="-1"/> 243 | <TopLine Value="300"/> 244 | <CursorPos X="14" Y="310"/> 245 | <UsageCount Value="13"/> 246 | </Unit28> 247 | </Units> 248 | <JumpHistory Count="30" HistoryIndex="29"> 249 | <Position1> 250 | <Filename Value="..\pascalobject_seralize.pas"/> 251 | <Caret Line="574" TopLine="563"/> 252 | </Position1> 253 | <Position2> 254 | <Filename Value="..\pascalobject_seralize.pas"/> 255 | <Caret Line="575" TopLine="563"/> 256 | </Position2> 257 | <Position3> 258 | <Filename Value="test_pascalobjectseralize.pas"/> 259 | <Caret Line="279" TopLine="268"/> 260 | </Position3> 261 | <Position4> 262 | <Filename Value="test_pascalobjectseralize.pas"/> 263 | <Caret Line="77" TopLine="66"/> 264 | </Position4> 265 | <Position5> 266 | <Filename Value="test_pascalobjectseralize.pas"/> 267 | <Caret Line="78" TopLine="66"/> 268 | </Position5> 269 | <Position6> 270 | <Filename Value="test_pascalobjectseralize.pas"/> 271 | <Caret Line="79" TopLine="66"/> 272 | </Position6> 273 | <Position7> 274 | <Filename Value="..\pascalobject_seralize.pas"/> 275 | <Caret Line="523" TopLine="512"/> 276 | </Position7> 277 | <Position8> 278 | <Filename Value="..\pascalobject_seralize.pas"/> 279 | <Caret Line="524" TopLine="512"/> 280 | </Position8> 281 | <Position9> 282 | <Filename Value="..\pascalobject_seralize.pas"/> 283 | <Caret Line="525" TopLine="512"/> 284 | </Position9> 285 | <Position10> 286 | <Filename Value="..\pascalobject_seralize.pas"/> 287 | <Caret Line="518" TopLine="512"/> 288 | </Position10> 289 | <Position11> 290 | <Filename Value="..\pascalobject_seralize.pas"/> 291 | <Caret Line="432" TopLine="421"/> 292 | </Position11> 293 | <Position12> 294 | <Filename Value="..\pascalobject_seralize.pas"/> 295 | <Caret Line="433" TopLine="421"/> 296 | </Position12> 297 | <Position13> 298 | <Filename Value="..\pascalobject_seralize.pas"/> 299 | <Caret Line="574" TopLine="563"/> 300 | </Position13> 301 | <Position14> 302 | <Filename Value="..\pascalobject_seralize.pas"/> 303 | <Caret Line="575" TopLine="563"/> 304 | </Position14> 305 | <Position15> 306 | <Filename Value="..\pascalobject_seralize.pas"/> 307 | <Caret Line="478" TopLine="467"/> 308 | </Position15> 309 | <Position16> 310 | <Filename Value="..\pascalobject_seralize.pas"/> 311 | <Caret Line="479" TopLine="467"/> 312 | </Position16> 313 | <Position17> 314 | <Filename Value="..\pascalobject_seralize.pas"/> 315 | <Caret Line="481" TopLine="470"/> 316 | </Position17> 317 | <Position18> 318 | <Filename Value="..\pascalobject_seralize.pas"/> 319 | <Caret Line="410" TopLine="399"/> 320 | </Position18> 321 | <Position19> 322 | <Filename Value="..\pascalobject_seralize.pas"/> 323 | <Caret Line="411" TopLine="399"/> 324 | </Position19> 325 | <Position20> 326 | <Filename Value="..\fpc_seralizeadapter.pas"/> 327 | <Caret Line="117" TopLine="112"/> 328 | </Position20> 329 | <Position21> 330 | <Filename Value="test_pascalobjectseralize.pas"/> 331 | <Caret Line="279" TopLine="268"/> 332 | </Position21> 333 | <Position22> 334 | <Filename Value="..\fpc_seralizeadapter.pas"/> 335 | <Caret Line="117" TopLine="112"/> 336 | </Position22> 337 | <Position23> 338 | <Filename Value="test_pascalobjectseralize.pas"/> 339 | <Caret Line="279" TopLine="268"/> 340 | </Position23> 341 | <Position24> 342 | <Filename Value="..\fpc_seralizeadapter.pas"/> 343 | <Caret Line="166" Column="8" TopLine="159"/> 344 | </Position24> 345 | <Position25> 346 | <Filename Value="..\fpc_seralizeadapter.pas"/> 347 | <Caret Line="168" TopLine="155"/> 348 | </Position25> 349 | <Position26> 350 | <Filename Value="..\fpc_seralizeadapter.pas"/> 351 | <Caret Line="170" Column="18" TopLine="148"/> 352 | </Position26> 353 | <Position27> 354 | <Filename Value="..\fpc_seralizeadapter.pas"/> 355 | <Caret Line="168" Column="10" TopLine="157"/> 356 | </Position27> 357 | <Position28> 358 | <Filename Value="..\fpc_seralizeadapter.pas"/> 359 | <Caret Line="73" Column="16" TopLine="63"/> 360 | </Position28> 361 | <Position29> 362 | <Filename Value="..\fpc_seralizeadapter.pas"/> 363 | <Caret Line="168" Column="32" TopLine="157"/> 364 | </Position29> 365 | <Position30> 366 | <Filename Value="..\fpc_seralizeadapter.pas"/> 367 | <Caret Line="208" Column="37" TopLine="201"/> 368 | </Position30> 369 | </JumpHistory> 370 | </ProjectSession> 371 | <Debugging> 372 | <BreakPoints Count="3"> 373 | <Item1> 374 | <Kind Value="bpkSource"/> 375 | <WatchScope Value="wpsLocal"/> 376 | <WatchKind Value="wpkWrite"/> 377 | <Source Value="..\fpc_seralizeadapter.pas"/> 378 | <Line Value="189"/> 379 | </Item1> 380 | <Item2> 381 | <Kind Value="bpkSource"/> 382 | <WatchScope Value="wpsLocal"/> 383 | <WatchKind Value="wpkWrite"/> 384 | <Source Value="test_pascalobjectseralize.pas"/> 385 | <Line Value="279"/> 386 | </Item2> 387 | <Item3> 388 | <Kind Value="bpkSource"/> 389 | <WatchScope Value="wpsLocal"/> 390 | <WatchKind Value="wpkWrite"/> 391 | <Source Value="..\fpc_seralizeadapter.pas"/> 392 | <Line Value="117"/> 393 | </Item3> 394 | </BreakPoints> 395 | <Watches Count="5"> 396 | <Item1 ClassAutoCast="True"> 397 | <Expression Value="obj.classname"/> 398 | </Item1> 399 | <Item2> 400 | <Expression Value="PropObj"/> 401 | </Item2> 402 | <Item3> 403 | <Expression Value="PROP"/> 404 | </Item3> 405 | <Item4> 406 | <Expression Value="PProp^.Name"/> 407 | </Item4> 408 | <Item5> 409 | <Expression Value="Node.ChildItem[intI].NodeName"/> 410 | </Item5> 411 | </Watches> 412 | </Debugging> 413 | </CONFIG> 414 | -------------------------------------------------------------------------------- /test/backup/test_pascalobjectseralize.pas: -------------------------------------------------------------------------------- 1 | unit test_pascalobjectseralize; 2 | 3 | {$mode objfpc}{$H+} 4 | 5 | interface 6 | 7 | uses 8 | Classes, SysUtils, typinfo, pascalobject_seralize, intf_seralizeadapter, 9 | fpc_seralizeadapter, dateutils, base64, dbugintf, dbugmsg, frm_Test, fpcunit, 10 | testutils, testregistry; 11 | 12 | type 13 | 14 | { TDataItem } 15 | 16 | TDataItem =Class(TcollectionItem) 17 | private 18 | FDateTime: TDateTime; 19 | fdbl: double; 20 | FInteger: integer; 21 | FStr: string; 22 | published 23 | property testInteger:integer read FInteger write FInteger; 24 | property testDate:TDateTime read FDateTime write FDateTime; 25 | property testString:string read FStr write FStr; 26 | property testFloat:double read fdbl write fdbl; 27 | end; 28 | 29 | { TDataCollection } 30 | 31 | TDataCollection=class(TCollection) 32 | 33 | private 34 | FName: string; 35 | function GetDataItem(Index: integer): TDataItem; 36 | public 37 | function AddDataItem:TDataItem; 38 | property DataItem[Index:integer]:TDataItem read GetDataItem; 39 | published 40 | property datacollectionName:string read FName write FName; 41 | end; 42 | { TestPascalSeralize } 43 | 44 | TestPascalSeralize=class(TTestCase) 45 | protected 46 | Ffrm:TfrmTest; 47 | procedure Setup;override; 48 | procedure TearDown;override; 49 | published 50 | procedure TestGetPropInfo; 51 | end; 52 | 53 | { TestSearalizeObject } 54 | 55 | TestSearalizeObject= class(TTestCase) 56 | protected 57 | FW:TMyCustomWriter; 58 | FR:TMyCustomReader; 59 | 60 | procedure SetUp; override; 61 | procedure TearDown; override; 62 | published 63 | procedure TestReadfrmTest; 64 | procedure TestWritefrmTest; 65 | procedure TestWriteCollection; 66 | procedure TEstReadCollection; 67 | 68 | procedure TestWriteFrmTest_JsonAdapter; 69 | procedure TestReadFrmTest_JsonAdapter; 70 | procedure TestWriteCollection_Json; 71 | procedure TestReadCollection_Json; 72 | procedure TestWriterCollection_XML; 73 | procedure TestReadCollection_XML; 74 | end; 75 | function SampleDataPath:string; 76 | implementation 77 | 78 | function SampleDataPath: string; 79 | begin 80 | result :=GetCurrentDir+'\testData\'; 81 | end; 82 | 83 | { TDataCollection } 84 | 85 | function TDataCollection.GetDataItem(Index: integer): TDataItem; 86 | begin 87 | result :=self.Items[Index] as TDataItem; 88 | end; 89 | 90 | function TDataCollection.AddDataItem: TDataItem; 91 | begin 92 | result :=TDataItem.Create(self); 93 | end; 94 | 95 | 96 | 97 | { TestPascalSeralize } 98 | 99 | procedure TestPascalSeralize.Setup; 100 | begin 101 | inherited ; 102 | fFrm :=TfrmTest.Create(nil); 103 | end; 104 | 105 | procedure TestPascalSeralize.TearDown; 106 | begin 107 | FreeAndNil(fFrm); 108 | inherited ; 109 | end; 110 | 111 | procedure TestPascalSeralize.TestGetPropInfo; 112 | var 113 | I: Integer; 114 | PList: PPropList; 115 | intPropCount: Integer; 116 | PInfo: PPropInfo; 117 | begin 118 | 119 | 120 | // Save Collection 121 | intPropCount := GetTypeData(ffrm.ClassInfo)^.PropCount; 122 | GetMem(PList, intPropCount * SizeOf(Pointer)); 123 | try 124 | intPropCount := GetPropList(ffrm.ClassInfo, tkAny, PList); 125 | for I := 0 to intPropCount-1 do 126 | begin 127 | PInfo :=PList^[I]; 128 | 129 | {$IFOPT D+} 130 | //Please run C:\lazarus\tools\debugserver\debugserver.exe 131 | 132 | SendInteger('Prop Index:',Pinfo^.PropProcs); 133 | SendDebug('PropName:'+Pinfo^.Name); 134 | {$ENDIF} 135 | end; 136 | SendSeparator; 137 | finally 138 | FreeMem(PList, intPropCount * SizeOf(Pointer)); 139 | end; 140 | 141 | 142 | end; 143 | 144 | procedure TestSearalizeObject.TestWritefrmTest; 145 | var 146 | Iadp:IDataAdapter; 147 | frm:TfrmTest; 148 | begin 149 | iadp :=TFPCXmlAdapter.Create; 150 | frm :=TfrmTest.Create(nil); 151 | try 152 | fW.Adapter :=Iadp; 153 | frm.Image1.Picture.LoadFromFile(SampleDataPath+'test.png'); 154 | frm.ShowModal; 155 | fw.WriteObjectToFile(SampleDataPath+'test.xml',frm); 156 | finally 157 | FreeAndnil(frm); 158 | end; 159 | 160 | end; 161 | 162 | procedure TestSearalizeObject.TestWriteCollection; 163 | var 164 | coll:TDataCollection; 165 | Item:TDataItem; 166 | IAdp:TFPCXmlAdapter; 167 | begin 168 | Coll :=TDatacollection.Create(TdataItem); 169 | IAdp :=TFPCXmlAdapter.Create; 170 | try 171 | Coll.datacollectionName:='TestDataName'; 172 | 173 | Item :=coll.AddDataItem; 174 | item.testDate:=now; 175 | item.testFloat:=3.14; 176 | item.testInteger:=28; 177 | item.testString:='hello world'; 178 | fw.Adapter :=IAdp; 179 | fw.WriteObjectToFile(SampleDataPath+'testCollection.xml',Coll); 180 | 181 | finally 182 | FreeAndNil( Coll); 183 | end; 184 | end; 185 | 186 | procedure TestSearalizeObject.TEstReadCollection; 187 | var 188 | coll:TDataCollection; 189 | Item:TDataItem; 190 | IAdp:TFPCXmlAdapter; 191 | begin 192 | Coll :=TDatacollection.Create(TdataItem); 193 | IAdp :=TFPCXmlAdapter.Create; 194 | try 195 | fr.Adapter :=IAdp; 196 | fr.ReadFileToObject(SampleDataPath+'testcollection.xml',coll); 197 | checkequals(Coll.datacollectionName,'TestDataName'); 198 | Item :=Coll.DataItem[0]; 199 | 200 | checkequals(item.testString,'hello world'); 201 | checkequals(item.testInteger,28); 202 | checkequals(item.testFloat,3.14); 203 | checkequals(YearOf(item.testDate),yearOf(now)); 204 | 205 | finally 206 | FreeAndNil( Coll); 207 | end; 208 | 209 | end; 210 | 211 | procedure TestSearalizeObject.TestWriteFrmTest_JsonAdapter; 212 | var 213 | Iadp:IDataAdapter; 214 | frm:TfrmTest; 215 | begin 216 | iadp :=TFPCJsonAdapter.Create; 217 | frm :=TfrmTest.Create(nil); 218 | try 219 | fW.Adapter :=Iadp; 220 | frm.Image1.Picture.LoadFromFile(SampleDataPath+'test.png'); 221 | frm.ShowModal; 222 | fw.WriteObjectToFile(SampleDataPath+'test.json',frm); 223 | finally 224 | FreeAndnil(frm); 225 | end; 226 | end; 227 | 228 | procedure TestSearalizeObject.TestReadFrmTest_JsonAdapter; 229 | var 230 | Iadp:IDataAdapter; 231 | frm:TfrmTest; 232 | begin 233 | iadp :=TFPCJsonAdapter.Create; 234 | frm :=TfrmTest.Create(nil); 235 | try 236 | fr.Adapter :=Iadp; 237 | fr.ReadFileToObject(SampleDataPath+'test.json',frm) ; 238 | frm.ShowModal; 239 | finally 240 | FreeAndnil(frm); 241 | end; 242 | 243 | 244 | end; 245 | 246 | procedure TestSearalizeObject.TestWriteCollection_Json; 247 | var 248 | coll:TDataCollection; 249 | Item:TDataItem; 250 | IAdp:IDataAdapter; 251 | begin 252 | Coll :=TDatacollection.Create(TdataItem); 253 | IAdp :=TFPCJsonAdapter.Create; 254 | try 255 | Coll.datacollectionName:='TestDataName'; 256 | 257 | Item :=coll.AddDataItem; 258 | item.testDate:=now; 259 | item.testFloat:=3.14; 260 | item.testInteger:=28; 261 | item.testString:='hello world'; 262 | fw.Adapter :=IAdp; 263 | fw.WriteObjectToFile(SampleDataPath+'testCollection.Json',Coll); 264 | 265 | finally 266 | FreeAndNil( Coll); 267 | end; 268 | 269 | end; 270 | 271 | procedure TestSearalizeObject.TestReadCollection_Json; 272 | var 273 | coll:TDataCollection; 274 | Item:TDataItem; 275 | IAdp:IDataAdapter; 276 | begin 277 | Coll :=TDatacollection.Create(TdataItem); 278 | IAdp :=TFPCJsonAdapter.Create; 279 | try 280 | fr.Adapter :=IAdp; 281 | fr.ReadFileToObject(SampleDataPath+'testcollection.Json',coll); 282 | checkequals(Coll.datacollectionName,'TestDataName'); 283 | Item :=Coll.DataItem[0]; 284 | 285 | checkequals(item.testString,'hello world'); 286 | checkequals(item.testInteger,28); 287 | checkequals(item.testFloat,3.14); 288 | checkequals(YearOf(item.testDate),yearOf(now)); 289 | 290 | finally 291 | FreeAndNil( Coll); 292 | end; 293 | 294 | end; 295 | 296 | procedure TestSearalizeObject.TestWriterCollection_XML; 297 | var 298 | coll:TDataCollection; 299 | Item:TDataItem; 300 | IAdp:IDataAdapter; 301 | begin 302 | Coll :=TDatacollection.Create(TdataItem); 303 | IAdp :=TFPCXmlAdapter.Create; 304 | try 305 | Coll.datacollectionName:='TestDataName'; 306 | 307 | Item :=coll.AddDataItem; 308 | item.testDate:=now; 309 | item.testFloat:=3.14; 310 | item.testInteger:=28; 311 | item.testString:='hello world'; 312 | fw.Adapter :=IAdp; 313 | fw.WriteObjectToFile(SampleDataPath+'testCollection.XML',Coll); 314 | 315 | finally 316 | FreeAndNil( Coll); 317 | end; 318 | end; 319 | 320 | procedure TestSearalizeObject.TestReadCollection_XML; 321 | var 322 | coll:TDataCollection; 323 | Item:TDataItem; 324 | IAdp:IDataAdapter; 325 | begin 326 | Coll :=TDatacollection.Create(TdataItem); 327 | IAdp :=TFPCXmlAdapter.Create; 328 | try 329 | fr.Adapter :=IAdp; 330 | fr.ReadFileToObject(SampleDataPath+'testcollection.Json',coll); 331 | checkequals(Coll.datacollectionName,'TestDataName'); 332 | Item :=Coll.DataItem[0]; 333 | 334 | checkequals(item.testString,'hello world'); 335 | checkequals(item.testInteger,28); 336 | checkequals(item.testFloat,3.14); 337 | checkequals(YearOf(item.testDate),yearOf(now)); 338 | 339 | finally 340 | FreeAndNil( Coll); 341 | end; 342 | end; 343 | 344 | procedure TestSearalizeObject.SetUp; 345 | begin 346 | FW :=TMyCustomWriter.Create(nil); 347 | Fr :=TMyCustomReader.Create(nil); 348 | end; 349 | 350 | procedure TestSearalizeObject.TearDown; 351 | begin 352 | FreeAndnil(Fr); 353 | FreeAndNil(FW); 354 | end; 355 | 356 | 357 | 358 | procedure TestSearalizeObject.TestReadfrmTest; 359 | var 360 | Iadp:IDataAdapter; 361 | frm:TfrmTest; 362 | begin 363 | iadp :=TFPCXmlAdapter.Create; 364 | frm :=TfrmTest.Create(nil); 365 | try 366 | fr.Adapter :=Iadp; 367 | fr.ReadFileToObject(SampleDataPath+'test.xml',frm) ; 368 | frm.ShowModal; 369 | finally 370 | FreeAndnil(frm); 371 | end; 372 | 373 | 374 | end; 375 | 376 | 377 | 378 | 379 | 380 | initialization 381 | RegisterClass(TDatacollection); 382 | RegisterClass(TDataItem); 383 | RegisterTest(TestPascalSeralize); 384 | RegisterTest(TestSearalizeObject); 385 | end. 386 | 387 | -------------------------------------------------------------------------------- /test/backup/testfpc_seralizeadapter_test.pas: -------------------------------------------------------------------------------- 1 | unit testfpc_seralizeadapter_test; 2 | 3 | {$mode objfpc}{$H+} 4 | 5 | interface 6 | 7 | uses 8 | Classes, SysUtils, fpc_seralizeadapter, Forms, intf_seralizeadapter, dbugintf, 9 | fpjson, jsonparser, Laz_XMLRead, Laz2_DOM, laz2_XMLWrite, Laz_XMLWrite, 10 | fpcunit, testutils, testregistry; 11 | 12 | type 13 | 14 | { TXMLAccessTest } 15 | 16 | TXMLAccessTest=class(TTestCase) 17 | private 18 | fDoc:TXMLDocument; 19 | protected 20 | procedure SetUp; override; 21 | procedure TearDown; override; 22 | published 23 | procedure TestReadXML; 24 | Procedure TestAccessXMLAttribute; 25 | procedure TestAddAttribute; 26 | end; 27 | 28 | { TJSonAccessTest } 29 | 30 | TJSonAccessTest=class(TTestCase) 31 | private 32 | 33 | protected 34 | procedure SetUp;override; 35 | procedure TearDown; override; 36 | published 37 | procedure TestJsonAccess; 38 | end; 39 | 40 | TFpcAdapterTest= class(TTestCase) 41 | private 42 | FXML:TFPCXmlAdapter; 43 | 44 | protected 45 | procedure SetUp; override; 46 | procedure TearDown; override; 47 | published 48 | procedure XMLTest; 49 | end; 50 | 51 | implementation 52 | 53 | { TJSonAccessTest } 54 | 55 | procedure TJSonAccessTest.SetUp; 56 | begin 57 | inherited ; 58 | end; 59 | 60 | procedure TJSonAccessTest.TearDown; 61 | begin 62 | inherited ; 63 | end; 64 | 65 | procedure TJSonAccessTest.TestJsonAccess; 66 | var 67 | JData,JItem:TJSONData; 68 | JObj:TJsonObject; 69 | begin 70 | JData :=getJson('{"JSONDATA":{}}'); 71 | Jobj :=JData as TJsonObject; 72 | try 73 | SendInteger(Jobj.Count); 74 | Jobj :=(JData as TJsonObject).Items[0] as TJsonObject; 75 | Jobj.Add('testnod1',35); 76 | jobj.Add('testnod2',true); 77 | senddebug(jobj.AsJSON); 78 | 79 | 80 | checkequals(JObj.Items[0].AsString,'35'); 81 | checkequals(jobj.Items[1].AsString,'True'); 82 | senddebug(jobj.Items[1].AsString); 83 | 84 | finally 85 | FreeAndNil(JData); 86 | end; 87 | 88 | end; 89 | 90 | { TXMLAccessTest } 91 | 92 | procedure TXMLAccessTest.SetUp; 93 | var 94 | Path:string; 95 | begin 96 | Path :=GetCurrentDir(); 97 | ReadXMLFile(fDoc,Path+'\testdata\test.xml'); 98 | end; 99 | 100 | procedure TXMLAccessTest.TearDown; 101 | begin 102 | if Assigned(fDoc) then 103 | begin 104 | FreeAndnil(fDoc); 105 | end; 106 | end; 107 | 108 | procedure TXMLAccessTest.TestReadXML; 109 | var 110 | FirstNode:TDOMNode; 111 | begin 112 | FirstNode :=fDoc.ChildNodes[0]; 113 | 114 | checkequals(FirstNode.NodeName,'XMLOBJECT'); 115 | 116 | end; 117 | 118 | procedure TXMLAccessTest.TestAccessXMLAttribute; 119 | var 120 | FirstNode:TDOMNode; 121 | begin 122 | FirstNode :=fDoc.ChildNodes[0]; 123 | Checkequals(Firstnode.Attributes.Item[0].NodeValue,'TComponent'); 124 | 125 | checkequals(FirstNode.Attributes.GetNamedItem('PersistentType').NodeValue,'TComponent'); 126 | Checkequals(Firstnode.Attributes.GetNamedItem('ClassType').NodeValue,'TCodeLib'); 127 | end; 128 | 129 | procedure TXMLAccessTest.TestAddAttribute; 130 | var 131 | FirstNode:TDOMNode; 132 | attrNode:TDOMAttr; 133 | attrs:TDOMNamedNodeMap; 134 | begin 135 | FirstNode :=fDoc.ChildNodes[0]; 136 | attrNode :=fDoc.CreateAttribute('wac'); 137 | (FirstNode as TDomElement).SetAttribute('wac','test'); 138 | 139 | WriteXML(fDoc,'e:\test.xml'); 140 | end; 141 | 142 | procedure TFpcAdapterTest.XMLTest; 143 | 144 | begin 145 | 146 | end; 147 | 148 | procedure TFpcAdapterTest.SetUp; 149 | begin 150 | Fxml :=TFPCXmlAdapter.Create; 151 | end; 152 | 153 | procedure TFpcAdapterTest.TearDown; 154 | begin 155 | FreeandNil(FXML); 156 | end; 157 | 158 | initialization 159 | RegisterTest(TJSonAccessTest); 160 | RegisterTest(TXMLAccessTest); 161 | RegisterTest(TFpcAdapterTest); 162 | end. 163 | 164 | -------------------------------------------------------------------------------- /test/frm_test.lfm: -------------------------------------------------------------------------------- 1 | object frmTest: TfrmTest 2 | Left = 754 3 | Height = 373 4 | Top = 155 5 | Width = 427 6 | AllowDropFiles = True 7 | Caption = 'Action1' 8 | ClientHeight = 373 9 | ClientWidth = 427 10 | OnCreate = FormCreate 11 | LCLVersion = '1.6.4.0' 12 | object Image1: TImage 13 | Left = 16 14 | Height = 178 15 | Top = 24 16 | Width = 322 17 | end 18 | object Button1: TButton 19 | Left = 16 20 | Height = 25 21 | Top = 232 22 | Width = 75 23 | Action = actTest 24 | TabOrder = 0 25 | end 26 | object ActionList1: TActionList 27 | left = 335 28 | top = 233 29 | object actTest: TAction 30 | Caption = 'Action1' 31 | OnExecute = actTestExecute 32 | end 33 | end 34 | end 35 | -------------------------------------------------------------------------------- /test/frm_test.pas: -------------------------------------------------------------------------------- 1 | unit frm_Test; 2 | 3 | {$mode objfpc}{$H+} 4 | 5 | interface 6 | 7 | uses 8 | Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls, 9 | StdCtrls, ActnList; 10 | 11 | type 12 | 13 | { TfrmTest } 14 | 15 | TfrmTest = class(TForm) 16 | published 17 | actTest: TAction; 18 | ActionList1: TActionList; 19 | Button1: TButton; 20 | Image1: TImage; 21 | procedure actTestExecute(Sender: TObject); 22 | procedure FormCreate(Sender: TObject); 23 | private 24 | { private declarations } 25 | public 26 | { public declarations } 27 | end; 28 | 29 | var 30 | frmTest: TfrmTest; 31 | 32 | implementation 33 | 34 | {$R *.lfm} 35 | 36 | { TfrmTest } 37 | 38 | procedure TfrmTest.FormCreate(Sender: TObject); 39 | begin 40 | 41 | end; 42 | 43 | procedure TfrmTest.actTestExecute(Sender: TObject); 44 | begin 45 | 46 | end; 47 | 48 | end. 49 | 50 | -------------------------------------------------------------------------------- /test/pascalobject_seralize_test.compiled: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <CONFIG> 3 | <Compiler Value="C:\fpcupdeluxe\fpc\bin\i386-win32\fpc.exe" Date="1281580088"/> 4 | <Params Value=" -MObjFPC -Scaghi -CirotR -O1 -gw2 -godwarfsets -gl -gh -Xg -gt -WG -l -vewnhibq -FuE:\GitHub\PascalObjectSeralize -FuC:\fpcupdeluxe\lazarus\components\fpcunit\lib\i386-win32\win32 -FuC:\fpcupdeluxe\lazarus\components\synedit\units\i386-win32\win32 -FuC:\fpcupdeluxe\lazarus\lcl\units\i386-win32\win32 -FuC:\fpcupdeluxe\lazarus\lcl\units\i386-win32 -FuC:\fpcupdeluxe\lazarus\components\lazutils\lib\i386-win32 -FuC:\fpcupdeluxe\lazarus\packager\units\i386-win32 -FuE:\GitHub\PascalObjectSeralize\test\ -dLCL -dLCLwin32 pascalobject_seralize_test.lpr"/> 5 | </CONFIG> 6 | -------------------------------------------------------------------------------- /test/pascalobject_seralize_test.fpcunit.ini: -------------------------------------------------------------------------------- 1 | [WindowState] 2 | Left=238 3 | Top=96 4 | Width=575 5 | Height=663 6 | 7 | [Tests] 8 | All Tests.Checked=0 9 | All Tests.Expanded=1 10 | TJSonAccessTest.Checked=0 11 | TJSonAccessTest.Expanded=1 12 | TJSonAccessTest.TestJsonAccess.Checked=0 13 | TJSonAccessTest.TestJsonAccess.Expanded=0 14 | TXMLAccessTest.Checked=0 15 | TXMLAccessTest.Expanded=1 16 | TXMLAccessTest.TestReadXML.Checked=0 17 | TXMLAccessTest.TestReadXML.Expanded=0 18 | TXMLAccessTest.TestAccessXMLAttribute.Checked=0 19 | TXMLAccessTest.TestAccessXMLAttribute.Expanded=0 20 | TXMLAccessTest.TestAddAttribute.Checked=0 21 | TXMLAccessTest.TestAddAttribute.Expanded=0 22 | TFpcAdapterTest.Checked=1 23 | TFpcAdapterTest.Expanded=1 24 | TFpcAdapterTest.XMLTest.Checked=1 25 | TFpcAdapterTest.XMLTest.Expanded=0 26 | TestPascalSeralize.Checked=1 27 | TestPascalSeralize.Expanded=1 28 | TestPascalSeralize.TestGetPropInfo.Checked=1 29 | TestPascalSeralize.TestGetPropInfo.Expanded=0 30 | TestSearalizeObject.Checked=1 31 | TestSearalizeObject.Expanded=1 32 | TestSearalizeObject.TestReadfrmTest.Checked=1 33 | TestSearalizeObject.TestReadfrmTest.Expanded=0 34 | TestSearalizeObject.TestWritefrmTest.Checked=1 35 | TestSearalizeObject.TestWritefrmTest.Expanded=0 36 | TestSearalizeObject.TestWriteCollection.Checked=1 37 | TestSearalizeObject.TestWriteCollection.Expanded=0 38 | TestSearalizeObject.TEstReadCollection.Checked=1 39 | TestSearalizeObject.TEstReadCollection.Expanded=0 40 | TestSearalizeObject.TestWriteFrmTest_JsonAdapter.Checked=1 41 | TestSearalizeObject.TestWriteFrmTest_JsonAdapter.Expanded=0 42 | TestSearalizeObject.TestReadFrmTest_JsonAdapter.Checked=1 43 | TestSearalizeObject.TestReadFrmTest_JsonAdapter.Expanded=0 44 | TestSearalizeObject.TestWriteCollection_Json.Checked=1 45 | TestSearalizeObject.TestWriteCollection_Json.Expanded=0 46 | TestSearalizeObject.TestReadCollection_Json.Checked=1 47 | TestSearalizeObject.TestReadCollection_Json.Expanded=0 48 | TestSearalizeObject.TestWriterCollection_XML.Checked=1 49 | TestSearalizeObject.TestWriterCollection_XML.Expanded=0 50 | TestSearalizeObject.TestReadCollection_XML.Checked=1 51 | TestSearalizeObject.TestReadCollection_XML.Expanded=0 52 | -------------------------------------------------------------------------------- /test/pascalobject_seralize_test.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ericwang1104/PascalObjectSeralize/911dcbd0a2ce84cdca8a14b0812758d0133e2ef4/test/pascalobject_seralize_test.ico -------------------------------------------------------------------------------- /test/pascalobject_seralize_test.lpi: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <CONFIG> 3 | <ProjectOptions> 4 | <Version Value="10"/> 5 | <PathDelim Value="\"/> 6 | <General> 7 | <SessionStorage Value="InProjectDir"/> 8 | <MainUnit Value="0"/> 9 | <Title Value="pascalobject_seralize_test"/> 10 | <Scaled Value="True"/> 11 | <ResourceType Value="res"/> 12 | <UseXPManifest Value="True"/> 13 | <Icon Value="0"/> 14 | </General> 15 | <i18n> 16 | <EnableI18N LFM="False"/> 17 | </i18n> 18 | <BuildModes Count="2"> 19 | <Item1 Name="Debug" Default="True"/> 20 | <Item2 Name="Release"> 21 | <CompilerOptions> 22 | <Version Value="11"/> 23 | <PathDelim Value="\"/> 24 | <SearchPaths> 25 | <IncludeFiles Value="$(ProjOutDir)"/> 26 | <OtherUnitFiles Value=".."/> 27 | </SearchPaths> 28 | <CodeGeneration> 29 | <SmartLinkUnit Value="True"/> 30 | <Optimizations> 31 | <OptimizationLevel Value="3"/> 32 | </Optimizations> 33 | </CodeGeneration> 34 | <Linking> 35 | <Debugging> 36 | <GenerateDebugInfo Value="False"/> 37 | </Debugging> 38 | <LinkSmart Value="True"/> 39 | <Options> 40 | <Win32> 41 | <GraphicApplication Value="True"/> 42 | </Win32> 43 | </Options> 44 | </Linking> 45 | </CompilerOptions> 46 | </Item2> 47 | </BuildModes> 48 | <PublishOptions> 49 | <Version Value="2"/> 50 | </PublishOptions> 51 | <RunParams> 52 | <local> 53 | <FormatVersion Value="1"/> 54 | </local> 55 | </RunParams> 56 | <RequiredPackages Count="3"> 57 | <Item1> 58 | <PackageName Value="LCL"/> 59 | </Item1> 60 | <Item2> 61 | <PackageName Value="fpcunittestrunner"/> 62 | </Item2> 63 | <Item3> 64 | <PackageName Value="fpcunitide"/> 65 | </Item3> 66 | </RequiredPackages> 67 | <Units Count="7"> 68 | <Unit0> 69 | <Filename Value="pascalobject_seralize_test.lpr"/> 70 | <IsPartOfProject Value="True"/> 71 | </Unit0> 72 | <Unit1> 73 | <Filename Value="..\fpc_seralizeadapter.pas"/> 74 | <IsPartOfProject Value="True"/> 75 | </Unit1> 76 | <Unit2> 77 | <Filename Value="..\intf_seralizeadapter.pas"/> 78 | <IsPartOfProject Value="True"/> 79 | </Unit2> 80 | <Unit3> 81 | <Filename Value="..\pascalobject_seralize.pas"/> 82 | <IsPartOfProject Value="True"/> 83 | </Unit3> 84 | <Unit4> 85 | <Filename Value="testfpc_seralizeadapter_test.pas"/> 86 | <IsPartOfProject Value="True"/> 87 | </Unit4> 88 | <Unit5> 89 | <Filename Value="test_pascalobjectseralize.pas"/> 90 | <IsPartOfProject Value="True"/> 91 | </Unit5> 92 | <Unit6> 93 | <Filename Value="frm_test.pas"/> 94 | <IsPartOfProject Value="True"/> 95 | <ComponentName Value="frmTest"/> 96 | <HasResources Value="True"/> 97 | <ResourceBaseClass Value="Form"/> 98 | <UnitName Value="frm_Test"/> 99 | </Unit6> 100 | </Units> 101 | </ProjectOptions> 102 | <CompilerOptions> 103 | <Version Value="11"/> 104 | <PathDelim Value="\"/> 105 | <SearchPaths> 106 | <IncludeFiles Value="$(ProjOutDir)"/> 107 | <OtherUnitFiles Value=".."/> 108 | </SearchPaths> 109 | <Parsing> 110 | <SyntaxOptions> 111 | <IncludeAssertionCode Value="True"/> 112 | </SyntaxOptions> 113 | </Parsing> 114 | <CodeGeneration> 115 | <Checks> 116 | <IOChecks Value="True"/> 117 | <RangeChecks Value="True"/> 118 | <OverflowChecks Value="True"/> 119 | <StackChecks Value="True"/> 120 | </Checks> 121 | <VerifyObjMethodCallValidity Value="True"/> 122 | </CodeGeneration> 123 | <Linking> 124 | <Debugging> 125 | <DebugInfoType Value="dsDwarf2Set"/> 126 | <UseHeaptrc Value="True"/> 127 | <TrashVariables Value="True"/> 128 | <UseExternalDbgSyms Value="True"/> 129 | </Debugging> 130 | <Options> 131 | <Win32> 132 | <GraphicApplication Value="True"/> 133 | </Win32> 134 | </Options> 135 | </Linking> 136 | </CompilerOptions> 137 | <Debugging> 138 | <Exceptions Count="3"> 139 | <Item1> 140 | <Name Value="EAbort"/> 141 | </Item1> 142 | <Item2> 143 | <Name Value="ECodetoolError"/> 144 | </Item2> 145 | <Item3> 146 | <Name Value="EFOpenError"/> 147 | </Item3> 148 | </Exceptions> 149 | </Debugging> 150 | </CONFIG> 151 | -------------------------------------------------------------------------------- /test/pascalobject_seralize_test.lpr: -------------------------------------------------------------------------------- 1 | program pascalobject_seralize_test; 2 | 3 | {$mode objfpc}{$H+} 4 | uses 5 | Interfaces, Forms,GuiTestRunner, testfpc_seralizeadapter_test, 6 | test_pascalobjectseralize, frm_Test; 7 | 8 | {$R *.res} 9 | 10 | begin 11 | Application.Scaled:=True; 12 | Application.Initialize; 13 | Application.CreateForm(TGuiTestRunner, TestRunner); 14 | Application.CreateForm(TfrmTest, frmTest); 15 | Application.Run; 16 | end. 17 | 18 | -------------------------------------------------------------------------------- /test/pascalobject_seralize_test.lps: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <CONFIG> 3 | <ProjectSession> 4 | <PathDelim Value="\"/> 5 | <Version Value="10"/> 6 | <BuildModes Active="Debug"/> 7 | <Units Count="37"> 8 | <Unit0> 9 | <Filename Value="pascalobject_seralize_test.lpr"/> 10 | <IsPartOfProject Value="True"/> 11 | <CursorPos Y="16"/> 12 | <UsageCount Value="91"/> 13 | <Loaded Value="True"/> 14 | </Unit0> 15 | <Unit1> 16 | <Filename Value="..\fpc_seralizeadapter.pas"/> 17 | <IsPartOfProject Value="True"/> 18 | <EditorIndex Value="1"/> 19 | <TopLine Value="482"/> 20 | <CursorPos Y="488"/> 21 | <UsageCount Value="91"/> 22 | <Bookmarks Count="2"> 23 | <Item0 X="22" Y="139" ID="1"/> 24 | <Item1 Y="177" ID="4"/> 25 | </Bookmarks> 26 | <Loaded Value="True"/> 27 | </Unit1> 28 | <Unit2> 29 | <Filename Value="..\intf_seralizeadapter.pas"/> 30 | <IsPartOfProject Value="True"/> 31 | <EditorIndex Value="5"/> 32 | <TopLine Value="8"/> 33 | <CursorPos X="14" Y="20"/> 34 | <UsageCount Value="91"/> 35 | <Loaded Value="True"/> 36 | </Unit2> 37 | <Unit3> 38 | <Filename Value="..\pascalobject_seralize.pas"/> 39 | <IsPartOfProject Value="True"/> 40 | <EditorIndex Value="6"/> 41 | <TopLine Value="530"/> 42 | <CursorPos X="25" Y="527"/> 43 | <UsageCount Value="91"/> 44 | <Bookmarks Count="2"> 45 | <Item0 X="8" Y="629" ID="2"/> 46 | <Item1 X="15" Y="277" ID="3"/> 47 | </Bookmarks> 48 | <Loaded Value="True"/> 49 | </Unit3> 50 | <Unit4> 51 | <Filename Value="testfpc_seralizeadapter_test.pas"/> 52 | <IsPartOfProject Value="True"/> 53 | <EditorIndex Value="4"/> 54 | <TopLine Value="46"/> 55 | <CursorPos X="65" Y="123"/> 56 | <UsageCount Value="91"/> 57 | <Loaded Value="True"/> 58 | </Unit4> 59 | <Unit5> 60 | <Filename Value="test_pascalobjectseralize.pas"/> 61 | <IsPartOfProject Value="True"/> 62 | <IsVisibleTab Value="True"/> 63 | <EditorIndex Value="3"/> 64 | <TopLine Value="320"/> 65 | <CursorPos X="59" Y="330"/> 66 | <UsageCount Value="82"/> 67 | <Loaded Value="True"/> 68 | </Unit5> 69 | <Unit6> 70 | <Filename Value="frm_test.pas"/> 71 | <IsPartOfProject Value="True"/> 72 | <ComponentName Value="frmTest"/> 73 | <HasResources Value="True"/> 74 | <ResourceBaseClass Value="Form"/> 75 | <UnitName Value="frm_Test"/> 76 | <EditorIndex Value="7"/> 77 | <TopLine Value="7"/> 78 | <CursorPos X="32" Y="15"/> 79 | <UsageCount Value="78"/> 80 | <Loaded Value="True"/> 81 | <LoadedDesigner Value="True"/> 82 | </Unit6> 83 | <Unit7> 84 | <Filename Value="..\testxmlpersistent.pas"/> 85 | <EditorIndex Value="-1"/> 86 | <TopLine Value="13"/> 87 | <CursorPos X="3" Y="11"/> 88 | <UsageCount Value="54"/> 89 | </Unit7> 90 | <Unit8> 91 | <Filename Value="testcase1.pas"/> 92 | <UnitName Value="TestCase1"/> 93 | <EditorIndex Value="-1"/> 94 | <UsageCount Value="14"/> 95 | </Unit8> 96 | <Unit9> 97 | <Filename Value="C:\lazarus\components\fpcunit\guitestrunner.pas"/> 98 | <ComponentName Value="GUITestRunner"/> 99 | <HasResources Value="True"/> 100 | <ResourceBaseClass Value="Form"/> 101 | <UnitName Value="GuiTestRunner"/> 102 | <EditorIndex Value="-1"/> 103 | <TopLine Value="25"/> 104 | <CursorPos X="32" Y="39"/> 105 | <UsageCount Value="4"/> 106 | </Unit9> 107 | <Unit10> 108 | <Filename Value="C:\lazarus\components\lazutils\laz2_dom.pas"/> 109 | <UnitName Value="Laz2_DOM"/> 110 | <EditorIndex Value="-1"/> 111 | <TopLine Value="269"/> 112 | <CursorPos X="25" Y="286"/> 113 | <UsageCount Value="16"/> 114 | </Unit10> 115 | <Unit11> 116 | <Filename Value="C:\lazarus\fpc\3.0.2\source\rtl\inc\objpash.inc"/> 117 | <EditorIndex Value="-1"/> 118 | <TopLine Value="182"/> 119 | <CursorPos X="23" Y="193"/> 120 | <UsageCount Value="4"/> 121 | </Unit11> 122 | <Unit12> 123 | <Filename Value="C:\lazarus\components\lazutils\laz_xmlwrite.pas"/> 124 | <UnitName Value="Laz_XMLWrite"/> 125 | <EditorIndex Value="-1"/> 126 | <TopLine Value="10"/> 127 | <CursorPos X="3" Y="50"/> 128 | <UsageCount Value="12"/> 129 | </Unit12> 130 | <Unit13> 131 | <Filename Value="C:\lazarus\components\lazutils\laz2_xmlwrite.pas"/> 132 | <UnitName Value="laz2_XMLWrite"/> 133 | <EditorIndex Value="-1"/> 134 | <TopLine Value="349"/> 135 | <CursorPos X="17" Y="798"/> 136 | <UsageCount Value="12"/> 137 | </Unit13> 138 | <Unit14> 139 | <Filename Value="C:\lazarus\fpc\3.0.2\source\packages\rtl-objpas\src\inc\variants.pp"/> 140 | <EditorIndex Value="-1"/> 141 | <TopLine Value="2995"/> 142 | <CursorPos X="3" Y="2998"/> 143 | <UsageCount Value="9"/> 144 | </Unit14> 145 | <Unit15> 146 | <Filename Value="C:\lazarus\fpc\3.0.2\source\rtl\inc\varianth.inc"/> 147 | <EditorIndex Value="-1"/> 148 | <TopLine Value="109"/> 149 | <CursorPos X="31" Y="123"/> 150 | <UsageCount Value="9"/> 151 | </Unit15> 152 | <Unit16> 153 | <Filename Value="C:\lazarus\fpc\3.0.2\source\packages\fcl-base\src\base64.pp"/> 154 | <EditorIndex Value="-1"/> 155 | <TopLine Value="31"/> 156 | <CursorPos X="26" Y="43"/> 157 | <UsageCount Value="7"/> 158 | </Unit16> 159 | <Unit17> 160 | <Filename Value="C:\lazarus\fpc\3.0.2\source\rtl\objpas\classes\classesh.inc"/> 161 | <EditorIndex Value="-1"/> 162 | <TopLine Value="64"/> 163 | <CursorPos X="25" Y="67"/> 164 | <UsageCount Value="20"/> 165 | </Unit17> 166 | <Unit18> 167 | <Filename Value="C:\lazarus\fpc\3.0.2\source\rtl\objpas\classes\cregist.inc"/> 168 | <EditorIndex Value="-1"/> 169 | <TopLine Value="111"/> 170 | <CursorPos X="10" Y="122"/> 171 | <UsageCount Value="7"/> 172 | </Unit18> 173 | <Unit19> 174 | <Filename Value="C:\lazarus\components\lazutils\laz_xmlread.pas"/> 175 | <UnitName Value="Laz_XMLRead"/> 176 | <EditorIndex Value="-1"/> 177 | <TopLine Value="5"/> 178 | <CursorPos X="11" Y="16"/> 179 | <UsageCount Value="6"/> 180 | </Unit19> 181 | <Unit20> 182 | <Filename Value="C:\lazarus\components\lazutils\laz2_xmlread.pas"/> 183 | <UnitName Value="laz2_XMLRead"/> 184 | <EditorIndex Value="-1"/> 185 | <TopLine Value="1698"/> 186 | <CursorPos X="30" Y="1700"/> 187 | <UsageCount Value="6"/> 188 | </Unit20> 189 | <Unit21> 190 | <Filename Value="C:\lazarus\fpc\3.0.2\source\rtl\objpas\typinfo.pp"/> 191 | <EditorIndex Value="-1"/> 192 | <TopLine Value="256"/> 193 | <CursorPos X="26" Y="280"/> 194 | <UsageCount Value="17"/> 195 | </Unit21> 196 | <Unit22> 197 | <Filename Value="frm_test.lfm"/> 198 | <EditorIndex Value="-1"/> 199 | <CursorPos X="9" Y="10"/> 200 | <UsageCount Value="6"/> 201 | <DefaultSyntaxHighlighter Value="LFM"/> 202 | </Unit22> 203 | <Unit23> 204 | <Filename Value="C:\lazarus\fpc\3.0.2\source\rtl\objpas\classes\streams.inc"/> 205 | <EditorIndex Value="-1"/> 206 | <TopLine Value="448"/> 207 | <CursorPos X="5" Y="454"/> 208 | <UsageCount Value="14"/> 209 | </Unit23> 210 | <Unit24> 211 | <Filename Value="C:\lazarus\lcl\forms.pp"/> 212 | <UnitName Value="Forms"/> 213 | <EditorIndex Value="-1"/> 214 | <TopLine Value="774"/> 215 | <CursorPos X="22" Y="774"/> 216 | <UsageCount Value="14"/> 217 | </Unit24> 218 | <Unit25> 219 | <Filename Value="C:\lazarus\lcl\controls.pp"/> 220 | <UnitName Value="Controls"/> 221 | <EditorIndex Value="-1"/> 222 | <TopLine Value="1633"/> 223 | <CursorPos X="30" Y="1635"/> 224 | <UsageCount Value="14"/> 225 | </Unit25> 226 | <Unit26> 227 | <Filename Value="C:\lazarus\fpc\3.0.2\source\packages\fcl-json\src\fpjson.pp"/> 228 | <EditorIndex Value="-1"/> 229 | <TopLine Value="2451"/> 230 | <CursorPos X="3" Y="2453"/> 231 | <UsageCount Value="16"/> 232 | </Unit26> 233 | <Unit27> 234 | <Filename Value="C:\lazarus\fpc\3.0.2\source\packages\fcl-json\src\jsonparser.pp"/> 235 | <EditorIndex Value="-1"/> 236 | <TopLine Value="127"/> 237 | <CursorPos X="3" Y="129"/> 238 | <UsageCount Value="9"/> 239 | </Unit27> 240 | <Unit28> 241 | <Filename Value="C:\lazarus\fpc\3.0.2\source\packages\fcl-base\src\contnrs.pp"/> 242 | <EditorIndex Value="-1"/> 243 | <TopLine Value="300"/> 244 | <CursorPos X="14" Y="310"/> 245 | <UsageCount Value="12"/> 246 | </Unit28> 247 | <Unit29> 248 | <Filename Value="C:\fpcupdeluxe\fpcsrc\packages\fcl-json\src\fpjson.pp"/> 249 | <EditorIndex Value="8"/> 250 | <TopLine Value="2433"/> 251 | <CursorPos X="3" Y="2435"/> 252 | <UsageCount Value="19"/> 253 | <Loaded Value="True"/> 254 | </Unit29> 255 | <Unit30> 256 | <Filename Value="C:\fpcupdeluxe\fpcsrc\rtl\objpas\sysutils\diskh.inc"/> 257 | <EditorIndex Value="-1"/> 258 | <TopLine Value="5"/> 259 | <CursorPos X="10" Y="18"/> 260 | <UsageCount Value="11"/> 261 | </Unit30> 262 | <Unit31> 263 | <Filename Value="C:\fpcupdeluxe\lazarus\components\lazutils\laz2_dom.pas"/> 264 | <UnitName Value="Laz2_DOM"/> 265 | <EditorIndex Value="-1"/> 266 | <TopLine Value="273"/> 267 | <CursorPos X="14" Y="283"/> 268 | <UsageCount Value="11"/> 269 | </Unit31> 270 | <Unit32> 271 | <Filename Value="C:\fpcupdeluxe\lazarus\components\lazutils\laz_xmlwrite.pas"/> 272 | <UnitName Value="Laz_XMLWrite"/> 273 | <EditorIndex Value="-1"/> 274 | <TopLine Value="38"/> 275 | <CursorPos X="3" Y="51"/> 276 | <UsageCount Value="10"/> 277 | </Unit32> 278 | <Unit33> 279 | <Filename Value="C:\fpcupdeluxe\lazarus\components\lazutils\laz_xmlread.pas"/> 280 | <UnitName Value="Laz_XMLRead"/> 281 | <EditorIndex Value="-1"/> 282 | <TopLine Value="44"/> 283 | <CursorPos X="3" Y="46"/> 284 | <UsageCount Value="10"/> 285 | </Unit33> 286 | <Unit34> 287 | <Filename Value="C:\fpcupdeluxe\fpcsrc\rtl\objpas\typinfo.pp"/> 288 | <EditorIndex Value="-1"/> 289 | <TopLine Value="319"/> 290 | <CursorPos X="10" Y="330"/> 291 | <UsageCount Value="9"/> 292 | </Unit34> 293 | <Unit35> 294 | <Filename Value="..\JsonDataObjects.pas"/> 295 | <EditorIndex Value="9"/> 296 | <TopLine Value="13"/> 297 | <CursorPos X="23" Y="737"/> 298 | <UsageCount Value="16"/> 299 | <Loaded Value="True"/> 300 | </Unit35> 301 | <Unit36> 302 | <Filename Value="C:\fpcupdeluxe\fpcsrc\rtl\inc\objpash.inc"/> 303 | <EditorIndex Value="2"/> 304 | <TopLine Value="272"/> 305 | <CursorPos X="50" Y="284"/> 306 | <UsageCount Value="11"/> 307 | <Loaded Value="True"/> 308 | </Unit36> 309 | </Units> 310 | <JumpHistory Count="30" HistoryIndex="29"> 311 | <Position1> 312 | <Filename Value="testfpc_seralizeadapter_test.pas"/> 313 | <Caret Line="82" TopLine="62"/> 314 | </Position1> 315 | <Position2> 316 | <Filename Value="testfpc_seralizeadapter_test.pas"/> 317 | <Caret Line="85" TopLine="65"/> 318 | </Position2> 319 | <Position3> 320 | <Filename Value="testfpc_seralizeadapter_test.pas"/> 321 | <Caret Line="113" Column="28" TopLine="102"/> 322 | </Position3> 323 | <Position4> 324 | <Filename Value="testfpc_seralizeadapter_test.pas"/> 325 | <Caret Line="20" Column="15" TopLine="11"/> 326 | </Position4> 327 | <Position5> 328 | <Filename Value="testfpc_seralizeadapter_test.pas"/> 329 | <Caret Line="99" Column="23" TopLine="95"/> 330 | </Position5> 331 | <Position6> 332 | <Filename Value="test_pascalobjectseralize.pas"/> 333 | <Caret Line="246" Column="65" TopLine="313"/> 334 | </Position6> 335 | <Position7> 336 | <Filename Value="test_pascalobjectseralize.pas"/> 337 | <Caret Line="63" Column="24" TopLine="52"/> 338 | </Position7> 339 | <Position8> 340 | <Filename Value="test_pascalobjectseralize.pas"/> 341 | <Caret Line="313" Column="3" TopLine="308"/> 342 | </Position8> 343 | <Position9> 344 | <Filename Value="test_pascalobjectseralize.pas"/> 345 | <Caret Line="71" Column="31" TopLine="58"/> 346 | </Position9> 347 | <Position10> 348 | <Filename Value="test_pascalobjectseralize.pas"/> 349 | <Caret Line="276" Column="3" TopLine="269"/> 350 | </Position10> 351 | <Position11> 352 | <Filename Value="test_pascalobjectseralize.pas"/> 353 | <Caret Line="71" Column="17" TopLine="60"/> 354 | </Position11> 355 | <Position12> 356 | <Filename Value="test_pascalobjectseralize.pas"/> 357 | <Caret Line="275" Column="3" TopLine="269"/> 358 | </Position12> 359 | <Position13> 360 | <Filename Value="test_pascalobjectseralize.pas"/> 361 | <Caret Line="70" Column="15" TopLine="60"/> 362 | </Position13> 363 | <Position14> 364 | <Filename Value="test_pascalobjectseralize.pas"/> 365 | <Caret Line="250" Column="3" TopLine="244"/> 366 | </Position14> 367 | <Position15> 368 | <Filename Value="test_pascalobjectseralize.pas"/> 369 | <Caret Line="69" Column="15" TopLine="59"/> 370 | </Position15> 371 | <Position16> 372 | <Filename Value="test_pascalobjectseralize.pas"/> 373 | <Caret Line="231" Column="3" TopLine="226"/> 374 | </Position16> 375 | <Position17> 376 | <Filename Value="test_pascalobjectseralize.pas"/> 377 | <Caret Line="68" Column="15" TopLine="58"/> 378 | </Position17> 379 | <Position18> 380 | <Filename Value="test_pascalobjectseralize.pas"/> 381 | <Caret Line="214" Column="3" TopLine="209"/> 382 | </Position18> 383 | <Position19> 384 | <Filename Value="test_pascalobjectseralize.pas"/> 385 | <Caret Line="72" Column="35" TopLine="57"/> 386 | </Position19> 387 | <Position20> 388 | <Filename Value="test_pascalobjectseralize.pas"/> 389 | <Caret Line="303" Column="5" TopLine="296"/> 390 | </Position20> 391 | <Position21> 392 | <Filename Value="test_pascalobjectseralize.pas"/> 393 | <Caret Line="70" Column="15" TopLine="62"/> 394 | </Position21> 395 | <Position22> 396 | <Filename Value="test_pascalobjectseralize.pas"/> 397 | <Caret Line="257" Column="26" TopLine="246"/> 398 | </Position22> 399 | <Position23> 400 | <Filename Value="test_pascalobjectseralize.pas"/> 401 | <Caret Line="72" Column="15" TopLine="59"/> 402 | </Position23> 403 | <Position24> 404 | <Filename Value="test_pascalobjectseralize.pas"/> 405 | <Caret Line="308" Column="39" TopLine="293"/> 406 | </Position24> 407 | <Position25> 408 | <Filename Value="test_pascalobjectseralize.pas"/> 409 | <Caret Line="71" Column="15" TopLine="61"/> 410 | </Position25> 411 | <Position26> 412 | <Filename Value="test_pascalobjectseralize.pas"/> 413 | <Caret Line="281" Column="25" TopLine="271"/> 414 | </Position26> 415 | <Position27> 416 | <Filename Value="test_pascalobjectseralize.pas"/> 417 | <Caret Line="71" Column="15" TopLine="60"/> 418 | </Position27> 419 | <Position28> 420 | <Filename Value="test_pascalobjectseralize.pas"/> 421 | <Caret Line="277" Column="3" TopLine="271"/> 422 | </Position28> 423 | <Position29> 424 | <Filename Value="test_pascalobjectseralize.pas"/> 425 | <Caret Line="73" Column="15" TopLine="60"/> 426 | </Position29> 427 | <Position30> 428 | <Filename Value="test_pascalobjectseralize.pas"/> 429 | <Caret Line="334" TopLine="320"/> 430 | </Position30> 431 | </JumpHistory> 432 | </ProjectSession> 433 | <Debugging> 434 | <BreakPoints Count="3"> 435 | <Item1> 436 | <Kind Value="bpkSource"/> 437 | <WatchScope Value="wpsLocal"/> 438 | <WatchKind Value="wpkWrite"/> 439 | <Source Value="..\pascalobject_seralize.pas"/> 440 | <Line Value="566"/> 441 | </Item1> 442 | <Item2> 443 | <Kind Value="bpkSource"/> 444 | <WatchScope Value="wpsLocal"/> 445 | <WatchKind Value="wpkWrite"/> 446 | <Source Value="testfpc_seralizeadapter_test.pas"/> 447 | <Line Value="70"/> 448 | </Item2> 449 | <Item3> 450 | <Kind Value="bpkSource"/> 451 | <WatchScope Value="wpsLocal"/> 452 | <WatchKind Value="wpkWrite"/> 453 | <Source Value="test_pascalobjectseralize.pas"/> 454 | <Line Value="334"/> 455 | </Item3> 456 | </BreakPoints> 457 | <Watches Count="8"> 458 | <Item1 ClassAutoCast="True"> 459 | <Expression Value="obj.classname"/> 460 | </Item1> 461 | <Item2> 462 | <Expression Value="PropObj"/> 463 | </Item2> 464 | <Item3> 465 | <Expression Value="PROP"/> 466 | </Item3> 467 | <Item4> 468 | <Expression Value="PProp^.Name"/> 469 | </Item4> 470 | <Item5> 471 | <Expression Value="Node.ChildItem[intI].NodeName"/> 472 | </Item5> 473 | <Item6> 474 | <Expression Value="Instance"/> 475 | </Item6> 476 | <Item7> 477 | <Expression Value="Instance.name"/> 478 | </Item7> 479 | <Item8> 480 | <Expression Value="Text"/> 481 | </Item8> 482 | </Watches> 483 | </Debugging> 484 | </CONFIG> 485 | -------------------------------------------------------------------------------- /test/pascalobject_seralize_test.res: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ericwang1104/PascalObjectSeralize/911dcbd0a2ce84cdca8a14b0812758d0133e2ef4/test/pascalobject_seralize_test.res -------------------------------------------------------------------------------- /test/test_pascalobjectseralize.pas: -------------------------------------------------------------------------------- 1 | unit test_pascalobjectseralize; 2 | 3 | {$mode objfpc}{$H+} 4 | 5 | interface 6 | 7 | uses 8 | Classes, SysUtils, typinfo, pascalobject_seralize, intf_seralizeadapter, 9 | fpc_seralizeadapter, dateutils, base64, dbugintf, dbugmsg, frm_Test, fpcunit, 10 | testutils, testregistry; 11 | 12 | type 13 | 14 | { TDataItem } 15 | 16 | TDataItem =Class(TcollectionItem) 17 | private 18 | FDateTime: TDateTime; 19 | fdbl: double; 20 | FInteger: integer; 21 | FStr: string; 22 | published 23 | property testInteger:integer read FInteger write FInteger; 24 | property testDate:TDateTime read FDateTime write FDateTime; 25 | property testString:string read FStr write FStr; 26 | property testFloat:double read fdbl write fdbl; 27 | end; 28 | 29 | { TDataCollection } 30 | 31 | TDataCollection=class(TCollection) 32 | 33 | private 34 | FName: string; 35 | function GetDataItem(Index: integer): TDataItem; 36 | public 37 | function AddDataItem:TDataItem; 38 | property DataItem[Index:integer]:TDataItem read GetDataItem; 39 | published 40 | property datacollectionName:string read FName write FName; 41 | end; 42 | { TestPascalSeralize } 43 | 44 | TestPascalSeralize=class(TTestCase) 45 | protected 46 | Ffrm:TfrmTest; 47 | procedure Setup;override; 48 | procedure TearDown;override; 49 | published 50 | procedure TestGetPropInfo; 51 | end; 52 | 53 | { TestSearalizeObject } 54 | 55 | TestSearalizeObject= class(TTestCase) 56 | protected 57 | FW:TMyCustomWriter; 58 | FR:TMyCustomReader; 59 | 60 | procedure SetUp; override; 61 | procedure TearDown; override; 62 | published 63 | procedure TestReadfrmTest; 64 | procedure TestWritefrmTest; 65 | procedure TestWriteCollection; 66 | procedure TEstReadCollection; 67 | 68 | procedure TestWriteFrmTest_JsonAdapter; 69 | procedure TestReadFrmTest_JsonAdapter; 70 | procedure TestWriteCollection_Json; 71 | procedure TestReadCollection_Json; 72 | procedure TestWriterCollection_XML; 73 | procedure TestReadCollection_XML; 74 | end; 75 | function SampleDataPath:string; 76 | implementation 77 | 78 | function SampleDataPath: string; 79 | begin 80 | result :=GetCurrentDir+'\testData\'; 81 | end; 82 | 83 | { TDataCollection } 84 | 85 | function TDataCollection.GetDataItem(Index: integer): TDataItem; 86 | begin 87 | result :=self.Items[Index] as TDataItem; 88 | end; 89 | 90 | function TDataCollection.AddDataItem: TDataItem; 91 | begin 92 | result :=TDataItem.Create(self); 93 | end; 94 | 95 | 96 | 97 | { TestPascalSeralize } 98 | 99 | procedure TestPascalSeralize.Setup; 100 | begin 101 | inherited ; 102 | fFrm :=TfrmTest.Create(nil); 103 | end; 104 | 105 | procedure TestPascalSeralize.TearDown; 106 | begin 107 | FreeAndNil(fFrm); 108 | inherited ; 109 | end; 110 | 111 | procedure TestPascalSeralize.TestGetPropInfo; 112 | var 113 | I: Integer; 114 | PList: PPropList; 115 | intPropCount: Integer; 116 | PInfo: PPropInfo; 117 | begin 118 | 119 | 120 | // Save Collection 121 | intPropCount := GetTypeData(ffrm.ClassInfo)^.PropCount; 122 | GetMem(PList, intPropCount * SizeOf(Pointer)); 123 | try 124 | intPropCount := GetPropList(ffrm.ClassInfo, tkAny, PList); 125 | for I := 0 to intPropCount-1 do 126 | begin 127 | PInfo :=PList^[I]; 128 | 129 | {$IFOPT D+} 130 | //Please run C:\lazarus\tools\debugserver\debugserver.exe 131 | 132 | SendInteger('Prop Index:',Pinfo^.PropProcs); 133 | SendDebug('PropName:'+Pinfo^.Name); 134 | {$ENDIF} 135 | end; 136 | SendSeparator; 137 | finally 138 | FreeMem(PList, intPropCount * SizeOf(Pointer)); 139 | end; 140 | 141 | 142 | end; 143 | 144 | procedure TestSearalizeObject.TestWritefrmTest; 145 | var 146 | Iadp:IDataAdapter; 147 | frm:TfrmTest; 148 | begin 149 | iadp :=TFPCXmlAdapter.Create; 150 | frm :=TfrmTest.Create(nil); 151 | try 152 | fW.Adapter :=Iadp; 153 | frm.Image1.Picture.LoadFromFile(SampleDataPath+'test.png'); 154 | frm.ShowModal; 155 | fw.WriteObjectToFile(SampleDataPath+'test.xml',frm); 156 | finally 157 | FreeAndnil(frm); 158 | end; 159 | 160 | end; 161 | 162 | procedure TestSearalizeObject.TestWriteCollection; 163 | var 164 | coll:TDataCollection; 165 | Item:TDataItem; 166 | IAdp:TFPCXmlAdapter; 167 | begin 168 | Coll :=TDatacollection.Create(TdataItem); 169 | IAdp :=TFPCXmlAdapter.Create; 170 | try 171 | Coll.datacollectionName:='TestDataName'; 172 | 173 | Item :=coll.AddDataItem; 174 | item.testDate:=now; 175 | item.testFloat:=3.14; 176 | item.testInteger:=28; 177 | item.testString:='hello world'; 178 | fw.Adapter :=IAdp; 179 | fw.WriteObjectToFile(SampleDataPath+'testCollection.xml',Coll); 180 | 181 | finally 182 | FreeAndNil( Coll); 183 | end; 184 | end; 185 | 186 | procedure TestSearalizeObject.TEstReadCollection; 187 | var 188 | coll:TDataCollection; 189 | Item:TDataItem; 190 | IAdp:TFPCXmlAdapter; 191 | begin 192 | Coll :=TDatacollection.Create(TdataItem); 193 | IAdp :=TFPCXmlAdapter.Create; 194 | try 195 | fr.Adapter :=IAdp; 196 | fr.ReadFileToObject(SampleDataPath+'testcollection.xml',coll); 197 | checkequals(Coll.datacollectionName,'TestDataName'); 198 | Item :=Coll.DataItem[0]; 199 | 200 | checkequals(item.testString,'hello world'); 201 | checkequals(item.testInteger,28); 202 | checkequals(item.testFloat,3.14); 203 | checkequals(YearOf(item.testDate),yearOf(now)); 204 | 205 | finally 206 | FreeAndNil( Coll); 207 | end; 208 | 209 | end; 210 | 211 | procedure TestSearalizeObject.TestWriteFrmTest_JsonAdapter; 212 | var 213 | Iadp:IDataAdapter; 214 | frm:TfrmTest; 215 | begin 216 | iadp :=TFPCJsonAdapter.Create; 217 | frm :=TfrmTest.Create(nil); 218 | try 219 | fW.Adapter :=Iadp; 220 | frm.Image1.Picture.LoadFromFile(SampleDataPath+'test.png'); 221 | frm.ShowModal; 222 | fw.WriteObjectToFile(SampleDataPath+'test.json',frm); 223 | finally 224 | FreeAndnil(frm); 225 | end; 226 | end; 227 | 228 | procedure TestSearalizeObject.TestReadFrmTest_JsonAdapter; 229 | var 230 | Iadp:IDataAdapter; 231 | frm:TfrmTest; 232 | begin 233 | iadp :=TFPCJsonAdapter.Create; 234 | frm :=TfrmTest.Create(nil); 235 | try 236 | fr.Adapter :=Iadp; 237 | fr.ReadFileToObject(SampleDataPath+'test.json',frm) ; 238 | frm.ShowModal; 239 | finally 240 | FreeAndnil(frm); 241 | end; 242 | 243 | 244 | end; 245 | 246 | procedure TestSearalizeObject.TestWriteCollection_Json; 247 | var 248 | coll:TDataCollection; 249 | Item:TDataItem; 250 | IAdp:IDataAdapter; 251 | begin 252 | Coll :=TDatacollection.Create(TdataItem); 253 | IAdp :=TFPCJsonAdapter.Create; 254 | try 255 | Coll.datacollectionName:='TestDataName'; 256 | 257 | Item :=coll.AddDataItem; 258 | item.testDate:=now; 259 | item.testFloat:=3.14; 260 | item.testInteger:=28; 261 | item.testString:='hello world'; 262 | fw.Adapter :=IAdp; 263 | fw.WriteObjectToFile(SampleDataPath+'testCollection.Json',Coll); 264 | 265 | finally 266 | FreeAndNil( Coll); 267 | end; 268 | 269 | end; 270 | 271 | procedure TestSearalizeObject.TestReadCollection_Json; 272 | var 273 | coll:TDataCollection; 274 | Item:TDataItem; 275 | IAdp:IDataAdapter; 276 | begin 277 | Coll :=TDatacollection.Create(TdataItem); 278 | IAdp :=TFPCJsonAdapter.Create; 279 | try 280 | fr.Adapter :=IAdp; 281 | fr.ReadFileToObject(SampleDataPath+'testcollection.Json',coll); 282 | checkequals(Coll.datacollectionName,'TestDataName'); 283 | Item :=Coll.DataItem[0]; 284 | 285 | checkequals(item.testString,'hello world'); 286 | checkequals(item.testInteger,28); 287 | checkequals(item.testFloat,3.14); 288 | checkequals(YearOf(item.testDate),yearOf(now)); 289 | 290 | finally 291 | FreeAndNil( Coll); 292 | end; 293 | 294 | end; 295 | 296 | procedure TestSearalizeObject.TestWriterCollection_XML; 297 | var 298 | coll:TDataCollection; 299 | Item:TDataItem; 300 | IAdp:IDataAdapter; 301 | begin 302 | Coll :=TDatacollection.Create(TdataItem); 303 | IAdp :=TFPCXmlAdapter.Create; 304 | try 305 | Coll.datacollectionName:='TestDataName'; 306 | 307 | Item :=coll.AddDataItem; 308 | item.testDate:=now; 309 | item.testFloat:=3.14; 310 | item.testInteger:=28; 311 | item.testString:='hello world'; 312 | fw.Adapter :=IAdp; 313 | fw.WriteObjectToFile(SampleDataPath+'testCollection.XML',Coll); 314 | 315 | finally 316 | FreeAndNil( Coll); 317 | end; 318 | end; 319 | 320 | procedure TestSearalizeObject.TestReadCollection_XML; 321 | var 322 | coll:TDataCollection; 323 | Item:TDataItem; 324 | IAdp:IDataAdapter; 325 | begin 326 | Coll :=TDatacollection.Create(TdataItem); 327 | IAdp :=TFPCXmlAdapter.Create; 328 | try 329 | fr.Adapter :=IAdp; 330 | fr.ReadFileToObject(SampleDataPath+'testcollection.XML',coll); 331 | checkequals(Coll.datacollectionName,'TestDataName'); 332 | Item :=Coll.DataItem[0]; 333 | 334 | checkequals(item.testString,'hello world'); 335 | checkequals(item.testInteger,28); 336 | checkequals(item.testFloat,3.14); 337 | checkequals(YearOf(item.testDate),yearOf(now)); 338 | 339 | finally 340 | FreeAndNil( Coll); 341 | end; 342 | end; 343 | 344 | procedure TestSearalizeObject.SetUp; 345 | begin 346 | FW :=TMyCustomWriter.Create(nil); 347 | Fr :=TMyCustomReader.Create(nil); 348 | end; 349 | 350 | procedure TestSearalizeObject.TearDown; 351 | begin 352 | FreeAndnil(Fr); 353 | FreeAndNil(FW); 354 | end; 355 | 356 | 357 | 358 | procedure TestSearalizeObject.TestReadfrmTest; 359 | var 360 | Iadp:IDataAdapter; 361 | frm:TfrmTest; 362 | begin 363 | iadp :=TFPCXmlAdapter.Create; 364 | frm :=TfrmTest.Create(nil); 365 | try 366 | fr.Adapter :=Iadp; 367 | fr.ReadFileToObject(SampleDataPath+'test.xml',frm) ; 368 | frm.ShowModal; 369 | finally 370 | FreeAndnil(frm); 371 | end; 372 | 373 | 374 | end; 375 | 376 | 377 | 378 | 379 | 380 | initialization 381 | RegisterClass(TDatacollection); 382 | RegisterClass(TDataItem); 383 | RegisterTest(TestPascalSeralize); 384 | RegisterTest(TestSearalizeObject); 385 | end. 386 | 387 | -------------------------------------------------------------------------------- /test/testcase1.pas: -------------------------------------------------------------------------------- 1 | unit TestCase1; 2 | 3 | {$mode objfpc}{$H+} 4 | 5 | interface 6 | 7 | uses 8 | Classes, SysUtils, fpcunit, testutils, testregistry; 9 | 10 | type 11 | 12 | TTestCase1= class(TTestCase) 13 | published 14 | procedure TestHookUp; 15 | end; 16 | 17 | implementation 18 | 19 | procedure TTestCase1.TestHookUp; 20 | begin 21 | Fail('Write your own test'); 22 | end; 23 | 24 | 25 | 26 | initialization 27 | 28 | RegisterTest(TTestCase1); 29 | end. 30 | 31 | -------------------------------------------------------------------------------- /test/testdata/test.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ericwang1104/PascalObjectSeralize/911dcbd0a2ce84cdca8a14b0812758d0133e2ef4/test/testdata/test.png -------------------------------------------------------------------------------- /test/testdata/test.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <XMLObject Align="alNone" AlphaBlendValue="255" Anchors="akTop,akLeft" BiDiMode="bdLeftToRight" BorderIcons="biSystemMenu,biMinimize,biMaximize" BorderStyle="bsSizeable" BorderWidth="0" Caption="Action1" ClientHeight="373" ClientWidth="427" Color="536870912" Cursor="0" DefaultMonitor="dmActiveForm" DesignTimePPI="96" DragKind="dkDrag" DragMode="dmManual" FormStyle="fsNormal" Height="373" HelpContext="0" HelpFile="" HelpKeyword="" HelpType="htContext" Hint="" LCLVersion="1.8.0.6" Left="754" Name="frmTest_1" PixelsPerInch="96" PopupMode="pmNone" Position="poDesigned" SessionProperties="" ShowInTaskBar="stDefault" Tag="0" Top="155" Width="427" WindowState="wsNormal" ClassType="TfrmTest"> 3 | <Action/> 4 | <ActiveControl Align="alNone" Anchors="akTop,akLeft" BidiMode="bdLeftToRight" Caption="Action1" Color="536870912" Cursor="0" DragCursor="-12" DragKind="dkDrag" DragMode="dmManual" Height="25" HelpContext="0" HelpKeyword="" HelpType="htContext" Hint="" Left="16" ModalResult="0" Name="Button1" TabOrder="0" Tag="0" Top="232" Width="75" ClassType="TButton"> 5 | <Action Caption="Action1" Category="" GroupIndex="0" HelpContext="0" HelpKeyword="" HelpType="htContext" Hint="" ImageIndex="-1" Name="actTest" ShortCut="0" Tag="0" ClassType="TAction"> 6 | <SecondaryShortCuts ClassType="TShortCutList"/> 7 | </Action> 8 | <AnchorSideBottom Side="asrTop" ClassType="TAnchorSide"> 9 | <Control/> 10 | </AnchorSideBottom> 11 | <AnchorSideLeft Side="asrTop" ClassType="TAnchorSide"> 12 | <Control/> 13 | </AnchorSideLeft> 14 | <AnchorSideRight Side="asrTop" ClassType="TAnchorSide"> 15 | <Control/> 16 | </AnchorSideRight> 17 | <AnchorSideTop Side="asrTop" ClassType="TAnchorSide"> 18 | <Control/> 19 | </AnchorSideTop> 20 | <BorderSpacing Around="0" Bottom="0" CellAlignHorizontal="ccaFill" CellAlignVertical="ccaFill" InnerBorder="0" Left="0" Right="0" Top="0" ClassType="TControlBorderSpacing"/> 21 | <Constraints MaxHeight="0" MaxWidth="0" MinHeight="0" MinWidth="0" ClassType="TSizeConstraints"/> 22 | <Font CharSet="1" Color="536870912" Height="0" Name="default" Orientation="0" Pitch="fpDefault" Quality="fqDefault" Size="0" Style="" ClassType="TFont"/> 23 | <PopupMenu/> 24 | </ActiveControl> 25 | <AnchorSideBottom Side="asrTop" ClassType="TAnchorSide"> 26 | <Control/> 27 | </AnchorSideBottom> 28 | <AnchorSideLeft Side="asrTop" ClassType="TAnchorSide"> 29 | <Control/> 30 | </AnchorSideLeft> 31 | <AnchorSideRight Side="asrTop" ClassType="TAnchorSide"> 32 | <Control/> 33 | </AnchorSideRight> 34 | <AnchorSideTop Side="asrTop" ClassType="TAnchorSide"> 35 | <Control/> 36 | </AnchorSideTop> 37 | <ChildSizing ControlsPerLine="0" EnlargeHorizontal="crsAnchorAligning" EnlargeVertical="crsAnchorAligning" HorizontalSpacing="0" Layout="cclNone" LeftRightSpacing="0" ShrinkHorizontal="crsAnchorAligning" ShrinkVertical="crsAnchorAligning" TopBottomSpacing="0" VerticalSpacing="0" ClassType="TControlChildSizing"/> 38 | <Constraints MaxHeight="0" MaxWidth="0" MinHeight="0" MinWidth="0" ClassType="TSizeConstraints"/> 39 | <Font CharSet="1" Color="536870912" Height="0" Name="default" Orientation="0" Pitch="fpDefault" Quality="fqDefault" Size="0" Style="" ClassType="TFont"/> 40 | <HorzScrollBar Increment="8" Page="80" Position="0" Range="0" ClassType="TControlScrollBar"/> 41 | <Icon ClassType="TIcon"/> 42 | <Menu/> 43 | <PopupMenu/> 44 | <PopupParent/> 45 | <VertScrollBar Increment="8" Page="80" Position="0" Range="0" ClassType="TControlScrollBar"/> 46 | <ITEM Align="alNone" Anchors="akTop,akLeft" AntialiasingMode="amDontCare" Cursor="0" DragCursor="-12" DragMode="dmManual" Height="178" HelpContext="0" HelpKeyword="" HelpType="htContext" Hint="" Left="16" Name="Image1" Tag="0" Top="24" Width="322" ClassType="TImage"> 47 | <AnchorSideBottom Side="asrTop" ClassType="TAnchorSide"> 48 | <Control/> 49 | </AnchorSideBottom> 50 | <AnchorSideLeft Side="asrTop" ClassType="TAnchorSide"> 51 | <Control/> 52 | </AnchorSideLeft> 53 | <AnchorSideRight Side="asrTop" ClassType="TAnchorSide"> 54 | <Control/> 55 | </AnchorSideRight> 56 | <AnchorSideTop Side="asrTop" ClassType="TAnchorSide"> 57 | <Control/> 58 | </AnchorSideTop> 59 | <BorderSpacing Around="0" Bottom="0" CellAlignHorizontal="ccaFill" CellAlignVertical="ccaFill" InnerBorder="0" Left="0" Right="0" Top="0" ClassType="TControlBorderSpacing"/> 60 | <Constraints MaxHeight="0" MaxWidth="0" MinHeight="0" MinWidth="0" ClassType="TSizeConstraints"/> 61 | <Picture ClassType="TPicture"><![CDATA[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]]></Picture> 62 | <PopupMenu/> 63 | </ITEM> 64 | <ITEM Align="alNone" Anchors="akTop,akLeft" BidiMode="bdLeftToRight" Caption="Action1" Color="536870912" Cursor="0" DragCursor="-12" DragKind="dkDrag" DragMode="dmManual" Height="25" HelpContext="0" HelpKeyword="" HelpType="htContext" Hint="" Left="16" ModalResult="0" Name="Button1" TabOrder="0" Tag="0" Top="232" Width="75" ClassType="TButton"> 65 | <Action Caption="Action1" Category="" GroupIndex="0" HelpContext="0" HelpKeyword="" HelpType="htContext" Hint="" ImageIndex="-1" Name="actTest" ShortCut="0" Tag="0" ClassType="TAction"> 66 | <SecondaryShortCuts ClassType="TShortCutList"/> 67 | </Action> 68 | <AnchorSideBottom Side="asrTop" ClassType="TAnchorSide"> 69 | <Control/> 70 | </AnchorSideBottom> 71 | <AnchorSideLeft Side="asrTop" ClassType="TAnchorSide"> 72 | <Control/> 73 | </AnchorSideLeft> 74 | <AnchorSideRight Side="asrTop" ClassType="TAnchorSide"> 75 | <Control/> 76 | </AnchorSideRight> 77 | <AnchorSideTop Side="asrTop" ClassType="TAnchorSide"> 78 | <Control/> 79 | </AnchorSideTop> 80 | <BorderSpacing Around="0" Bottom="0" CellAlignHorizontal="ccaFill" CellAlignVertical="ccaFill" InnerBorder="0" Left="0" Right="0" Top="0" ClassType="TControlBorderSpacing"/> 81 | <Constraints MaxHeight="0" MaxWidth="0" MinHeight="0" MinWidth="0" ClassType="TSizeConstraints"/> 82 | <Font CharSet="1" Color="536870912" Height="0" Name="default" Orientation="0" Pitch="fpDefault" Quality="fqDefault" Size="0" Style="" ClassType="TFont"/> 83 | <PopupMenu/> 84 | </ITEM> 85 | <ITEM Name="ActionList1" State="asNormal" Tag="0" ClassType="TActionList"> 86 | <Images/> 87 | </ITEM> 88 | <ITEM Caption="Action1" Category="" GroupIndex="0" HelpContext="0" HelpKeyword="" HelpType="htContext" Hint="" ImageIndex="-1" Name="actTest" ShortCut="0" Tag="0" ClassType="TAction"> 89 | <SecondaryShortCuts ClassType="TShortCutList"/> 90 | </ITEM> 91 | </XMLObject> 92 | -------------------------------------------------------------------------------- /test/testdata/testCollection.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <XMLObject datacollectionName="TestDataName" ClassType="TDataCollection"> 3 | <ITEM testDate="43170.8765356829" testFloat="3.14" testInteger="28" testString="hello world" ClassType="TDataItem"/> 4 | </XMLObject> 5 | -------------------------------------------------------------------------------- /test/testfpc_seralizeadapter_test.pas: -------------------------------------------------------------------------------- 1 | unit testfpc_seralizeadapter_test; 2 | 3 | {$mode objfpc}{$H+} 4 | 5 | interface 6 | 7 | uses 8 | Classes, SysUtils, fpc_seralizeadapter, Forms, intf_seralizeadapter, dbugintf, 9 | fpjson, jsonparser, Laz_XMLRead, Laz2_DOM, laz2_XMLWrite, Laz_XMLWrite, 10 | fpcunit, testutils, testregistry; 11 | 12 | type 13 | 14 | { TXMLAccessTest } 15 | 16 | TXMLAccessTest=class(TTestCase) 17 | private 18 | fDoc:TXMLDocument; 19 | protected 20 | procedure SetUp; override; 21 | procedure TearDown; override; 22 | published 23 | procedure TestReadXML; 24 | Procedure TestAccessXMLAttribute; 25 | procedure TestAddAttribute; 26 | end; 27 | 28 | { TJSonAccessTest } 29 | 30 | TJSonAccessTest=class(TTestCase) 31 | private 32 | 33 | protected 34 | procedure SetUp;override; 35 | procedure TearDown; override; 36 | published 37 | procedure TestJsonAccess; 38 | end; 39 | 40 | TFpcAdapterTest= class(TTestCase) 41 | private 42 | FXML:TFPCXmlAdapter; 43 | 44 | protected 45 | procedure SetUp; override; 46 | procedure TearDown; override; 47 | published 48 | procedure XMLTest; 49 | end; 50 | 51 | implementation 52 | 53 | { TJSonAccessTest } 54 | 55 | procedure TJSonAccessTest.SetUp; 56 | begin 57 | inherited ; 58 | end; 59 | 60 | procedure TJSonAccessTest.TearDown; 61 | begin 62 | inherited ; 63 | end; 64 | 65 | procedure TJSonAccessTest.TestJsonAccess; 66 | var 67 | JData,JItem:TJSONData; 68 | JObj:TJsonObject; 69 | begin 70 | JData :=getJson('{"JSONDATA":{}}'); 71 | Jobj :=JData as TJsonObject; 72 | try 73 | SendInteger('JSONDATA',Jobj.Count); 74 | Jobj :=(JData as TJsonObject).Items[0] as TJsonObject; 75 | Jobj.Add('testnod1',35); 76 | jobj.Add('testnod2',true); 77 | senddebug(jobj.AsJSON); 78 | 79 | 80 | checkequals(JObj.Items[0].AsString,'35'); 81 | checkequals(jobj.Items[1].AsString,'True'); 82 | senddebug(jobj.Items[1].AsString); 83 | 84 | finally 85 | FreeAndNil(JData); 86 | end; 87 | 88 | end; 89 | 90 | { TXMLAccessTest } 91 | 92 | procedure TXMLAccessTest.SetUp; 93 | var 94 | Path:string; 95 | begin 96 | Path :=GetCurrentDir(); 97 | ReadXMLFile(fDoc,Path+'\testdata\test.xml'); 98 | end; 99 | 100 | procedure TXMLAccessTest.TearDown; 101 | begin 102 | if Assigned(fDoc) then 103 | begin 104 | FreeAndnil(fDoc); 105 | end; 106 | end; 107 | 108 | procedure TXMLAccessTest.TestReadXML; 109 | var 110 | FirstNode:TDOMNode; 111 | begin 112 | FirstNode :=fDoc.ChildNodes[0]; 113 | 114 | checkequals(FirstNode.NodeName,'XMLOBJECT'); 115 | 116 | end; 117 | 118 | procedure TXMLAccessTest.TestAccessXMLAttribute; 119 | var 120 | FirstNode:TDOMNode; 121 | begin 122 | FirstNode :=fDoc.ChildNodes[0]; 123 | Checkequals(Firstnode.Attributes.Item[0].NodeValue,'TComponent'); 124 | 125 | checkequals(FirstNode.Attributes.GetNamedItem('PersistentType').NodeValue,'TComponent'); 126 | Checkequals(Firstnode.Attributes.GetNamedItem('ClassType').NodeValue,'TCodeLib'); 127 | end; 128 | 129 | procedure TXMLAccessTest.TestAddAttribute; 130 | var 131 | FirstNode:TDOMNode; 132 | attrNode:TDOMAttr; 133 | attrs:TDOMNamedNodeMap; 134 | begin 135 | FirstNode :=fDoc.ChildNodes[0]; 136 | attrNode :=fDoc.CreateAttribute('wac'); 137 | (FirstNode as TDomElement).SetAttribute('wac','test'); 138 | 139 | WriteXML(fDoc,'e:\test.xml'); 140 | end; 141 | 142 | procedure TFpcAdapterTest.XMLTest; 143 | 144 | begin 145 | 146 | end; 147 | 148 | procedure TFpcAdapterTest.SetUp; 149 | begin 150 | Fxml :=TFPCXmlAdapter.Create; 151 | end; 152 | 153 | procedure TFpcAdapterTest.TearDown; 154 | begin 155 | FreeandNil(FXML); 156 | end; 157 | 158 | initialization 159 | RegisterTest(TJSonAccessTest); 160 | RegisterTest(TXMLAccessTest); 161 | RegisterTest(TFpcAdapterTest); 162 | end. 163 | 164 | --------------------------------------------------------------------------------