datasnap 2010 利用JSON序列化和反序列化任何类型的对象
2011-02-04 15:47
567 查看
先简单介绍下什么叫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的这个新特性为我们以后的开发带来了许多便利。
那么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的这个新特性为我们以后的开发带来了许多便利。
相关文章推荐
- C# .NET利用Newtonsoft.Json来序列化和反序列化对象
- 利用JavaScriptSerializer类 进行Json对象的序列化和反序列化和过滤
- C# 对象的序列化与反序列化 (DataContractJsonSerializer)
- 利用 进行Json对象的序列化和反序列化 - RJ - 博客园
- 使用DataContractJsonSerializer类将类型实例序列化为JSON字符串和反序列化为实例对象
- 利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
- 序列化类型为“System.Data.Entity.DynamicProxies.ActionInfo_”的对象时检测到循环引用。
- 在MVC中使用Json.Net序列化和反序列化Json对象
- 利用fastjson反序列化json为对象和对象数组
- DataContractJsonSerializer进行Json的序列化和反序列化
- 序列化类型为“System.Data.Entity.DynamicProxies.ActionInfo_”的对象时检测到循环引用。
- C# dynamic类型序列化和反序列化之Newtonsoft.Json
- [原]iOS动态特性初研究(利用JSON动态创建类型和对象)
- AJAX JSON中日期类型DateTime格式化的序列化自定义对象以及自定义类型参数的问题处理
- ASP.NET:使用Newtonsoft.Json序列化和反序列化JSON对象的例子
- 序列化类型为“System.Data.Entity.DynamicProxies.Photos....这个会的对象时检测到循环引用
- 关于JSON转换为对象时出现的:数据协定类型 “***”无法反序列化,因为未找到必需的数据成员 **(字段名)
- 在MVC中使用Json.Net序列化和反序列化Json对象
- 格式化程序尝试对消息反序列化时引发异常: 尝试对参数 http://tempuri.org/ 进行反序列化时出错: GetLzdtArticleResult。InnerException 消息是“反序列化对象 属于类型 lzdt.DTO.Dtolzdt[] 时出现错误。读取 XML 数据时,超出最大
- 使用json序列化类型为“ajax学习.DataSetComment+T_CommentDataTable”的对象时检测到循环引用。