序列化TList of objects

Some weeks ago a customer asked to me if it is possibile serialize a TList of objects. “Hey, you should use a TObjectList for this”, I said, but he absolutely needs (I dont know why) of a TList.

This is the (simple) sample code tested with Delphi XE2 Update4. Enjoy.

unit Unit4;

interface

uses
  Winapi.Windows,
  Winapi.Messages,
  System.SysUtils,
  System.Variants,
  System.Classes,
  Vcl.Graphics,
  Vcl.Controls,
  Vcl.Forms,
  Vcl.Dialogs,
  Vcl.StdCtrls;

type
  TForm4 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  TPerson = class
  private
    FName: String;
    procedure SetName(const Value: String);
  published
    property Name: String read FName write SetName;
  end;

var
  Form4: TForm4;

implementation

uses
  Contnrs,
  dbxjson,
  dbxjsonreflect;

{$R *.dfm}

procedure TForm4.Button1Click(Sender: TObject);
var
  list: TList;
  m: TJSONMarshal;
  json: TJSONObject;
  p1: TPerson;
  p2: TPerson;
begin
  p1 := TPerson.Create;
  p2 := TPerson.Create;
  try
    p1.Name := ‘Daniele Teti‘;
    p2.Name := ‘Peter Parker‘;
    list := TList.Create;
    try
      list.Add(p1);
      list.Add(p2);

      m := TJSONMarshal.Create;
      try
        // Register a specific converter for field FList
        m.RegisterConverter(TList, ‘FList‘, function(Data: TObject; Field: String): TListOfObjects
          var
            l: TList;
            j: integer;
          begin
            l := Data as TList;
            SetLength(Result, l.Count);
            for j := 0 to l.Count - 1 do
              Result[j] := TObject(l[j]); // HardCast from pointer
          end);

        json := m.Marshal(list) as TJSONObject;
        try
          Memo1.Lines.Text := json.tostring;
        finally
          json.free;
        end;
      finally
        m.free;
      end;
    finally
      list.free;
    end;
  finally
    p1.free;
    p2.free;
  end;
end;

{ TPerson }

procedure TPerson.SetName(const Value: String);
begin
  FName := Value;
end;

end.

The output is, as expected, the following:

{"type":"System.Classes.TList","id":1,"fields":{"FList":[{"type":"Unit4.TPerson","id":2,"fields":{"FName":"Daniele Teti"}},{"type":"Unit4.TPerson","id":3,"fields":{"FName":"Peter Parker"}}],"FCount":2,"FCapacity":4}}

http://www.danieleteti.it/how-to-serialize-a-tlist-of-objects-with-delphi/

时间: 2024-11-03 21:25:19

序列化TList of objects的相关文章

django python3 实例 mysql数据库

views.py中代码: def show_all_user(req): num=1 if 'pagenum' in req.POST: num=req.POST['pagenum'] tlist=User.objects.all() p=Paginator(tlist,30) page=p.page(num) return render_to_response('show_all_user.html',{'all_user':page.object_list,'pagenum':num,'to

Unity AssetBundles and Resources指引 (一)

本文内容主要翻译自下面这篇文章 https://unity3d.com/cn/learn/tutorials/topics/best-practices/guide-assetbundles-and-resources?playlist=30089  A guide to AssetBundles and Resources 为了消除一些歧义,文章里面的专有名词直接用英文单词,比如Assets.Resource.Object 这篇文章是关于在unity引擎中进行Assets和resource管理

django rest framework 解析器组件 接口设计,视图组件 (1)

一.解析器组件 -解析器组件是用来解析用户请求数据的(application/json), content-type 将客户端发来的json数据进行解析 -必须适应APIView -request.data触发 二.序列化组件 2.1.django 自带组件serializer 2.1.1 from django.serializers import serialize2.1.2 origin_data = Book.objects.all()2.1.3 serialized_data = se

一,Serializer和ModelSerializer

1.REST Framework概述 Django REST framework是一套基于Django的REST框架,是一个用于构建Web API的功能强大且灵活的工具包. RESTful 简述 Representational State Transfer(REST),是一种架构样式,定义了一套用于创建WEB服务的约束.当前WEB开发趋势就是前端层出不穷,为了保证一个后台同时适用于多个前端,需要一种统一的机制或API,而RESTful API是目前前后端分离的最佳实践. 为什么需要前后端分离?

Java Serializable Objects(序列化)

序列化一个对象,意味着把这个对象的状态转化为字节流,而且个字节流可以被恢复为这个对象的一个副本. 如果一个Java对象的所属类或者其任意一个父类实现了接口 java.io.Serializable 或者它的子类 java.io.Externalizable,那么我们称这个对象是可序列化的. 反序列化是将对象的序列化形式转换回对象的一个副本的过程. 可以把一个对象的序列化状态存储成一个文件,之后可以读回这个序列化状态,即进行反序列化,得到这个对象的一个副本. 原文地址:https://www.cn

细水长流话Hadoop(1)Hadoop序列化系统

声明:个人原创,转载请注明出处.文中引用了一些网上或书里的资料,如有不妥之处请告之. 本文是我阅读Hadoop 0.20.2第二遍时写的笔记,在阅读过程中碰到很多问题,最终通过各种途径解决了大部分.Hadoop整个系统设计精良,源码值得学习分布式的同学们阅读,以后会将所有笔记一一贴出,希望能方便大家阅读Hadoop源码,少走弯路. 1 序列化核心技术... 1 2 类型对象大小比较... 3 3 Writable类型工厂... 4 4 ObjectWritable类型... 5 5 其它序列化系

Android中Serializable和Parcelable序列化对象详解

学习内容: 1.序列化的目的 2.Android中序列化的两种方式 3.Parcelable与Serializable的性能比较 4.Android中如何使用Parcelable进行序列化操作 5.Parcelable的工作原理 6.相关实例 1.序列化的目的 (1).永久的保存对象数据(将对象数据保存在文件当中,或者是磁盘中 (2).通过序列化操作将对象数据在网络上进行传输(由于网络传输是以字节流的方式对数据进行传输的.因此序列化的目的是将对象数据转换成字节流的形式) (3).将对象数据在进程

django-rest-framework笔记-序列化篇

一.搭建环境 #新建虚拟环境 virtualenv venv source venv/bin/activate #在虚拟环境中安装项目依赖库 cat requirements.txt coreapi==2.3.1 django==1.11.4 django-filter==1.0.4 django-crispy-forms==1.6.1 django-guardian==1.4.9 httpie-0.9.9 Markdown==2.6.8 Pygments==2.2.0 pip install

序列化之protobuf与avro对比(Java)

最近在做socket通信中用到了关于序列化工具选型的问题,在调研过程中开始趋向于用protobuf,可以省去了编解码的过程.能够实现快速开发,且只需要维护一份协议文件即可. 但是调研过程中发现了protobuf的一些弊端,比如需要生成相应的文件类,和业务绑定太紧密,所以在看了AVRO之后发现它完美解决了这个问题. 下面记录下对这两种序列化工具的入门与测评. 一.protobuf基本操作 protobuf简介: Protocol Buffers (a.k.a., protobuf) are Goo