分享

datasnap 2010 利用JSON序列化和反序列化任何类型的对象

 aaie_ 2013-04-30

先简单介绍下什么叫marshalling? marshalling有点类似于序列化,它指的是一个转换的过程。将一个对象用一种适当的数据格式保存或转换。它一般用于不同两个程序间的通信和数据交换。与之对应的Unmarshalling故名思意也就是类似于反序列化的过程。
      那么2010中是如何支持Marshalling 的呢?举个小例子说明:

第一步:创建一个自定义的类
          TPerson = class
              FirstName: String;
              LastName: String;
              Age: Integer;
           end;
我们创建了一个简单的类,里面只有几个简单类型的field

第二步:marshalling这个Person类的实例
procedure TForm1.Button1Click(Sender: TObject);
var
  Mar: TJSONMarshal; //序列化对象
  UnMar: TJSONUnMarshal; // 反序列化对象
  person: TPerson; //我们自定义的对象
  SerializedPerson: TJSONObject; //Json对象
begin
  Mar := TJSONMarshal.Create(TJSONConverter.Create);
  try
    person := TPerson.Create;
    try
      person.FirstName := 'Nan';
      person.LastName := 'Dong';
      person.Age := 29;
      SerializedPerson := Mar.Marshal(person) as TJSONObject;
    finally
      FreeAndNil(person);
    end;
  finally
    Mar.Free;
  end;
  // show一下person的json对象的信息
  ShowMessage(SerializedPerson.ToString);
我们可以看到显示的信息中包含了该对象所属的类信息,ID,以及包含的fields。这时person对象已经转化为一个json对象SerializedPerson,这个json对象是完全语言无关,平台无关的。

第三步:Unmarshalling SerializedPerson

  //UnMarshalling
  UnMar := TJSONUnMarshal.Create;
  try
    person := UnMar.UnMarshal(SerializedPerson) as TPerson;
    try
      // 我们用断言检查一下,unmarshal后的信息完全正确。
      Assert(person.FirstName = 'Nan');
      Assert(person.LastName = 'Dong');
      Assert(person.Age = 29);
    finally
      person.Free;
    end;
  finally
    UnMar.Free;
  end;

以上的实例用到了 DBXJSONReflect, DBXJSON两个单元。有兴趣的朋友可以钻研下。另外,我只是举了一个简单类型的例子,当然也可以是复杂类型或自定义类型的marshal,有兴趣的朋友试一下。总之,Delphi2010的这个新特性为我们以后的开发带来了许多便利。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多