安卓intent开发过程中已经把所有实体类序列化了,为什么Intent传值的时候还是报异常了呢

您现在的位置: &
c#实体类序列化方法
c#实体类序列化方法
  提到为了传递数据,需要把作为载体的实体类序列化,好好的找了一些序列化方面的介绍。感觉下面的这个介绍比较容易介绍!
  1.什么是序列化
  序列化是将对象状态转换为可保持或传输的格式的过程,在序列化过程中,对象的公共字段和私有字段以及类的名称(包括包含该类的程序集)都被转换为字节流,然后写入数据流。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。
  2.为什么使用序列化
  a. 一个原因是将对象的状态保持在存储媒体中,以便可以在以后重新创建精确的副本。
  我们经常需要将对象的字段值保存到磁盘中,并在以后检索此数据。尽管不使用序列化也能完成这项工作,但这种方法通常很繁琐而且容易出错,并且在需要跟踪对象的层次结构时,会变得越来越复杂。可以想象一下编写包含大量对象的大型业务应用程序的情形,程序员不得不为每一个对象编写代码,以便将字段和属性保存至磁盘以及从磁盘还原这些字段和属性。序列化提供了轻松实现这个目标的快捷方法。
  b.另一个原因是通过值将对象从一个应用程序域发送到另一个应用程序域中。
  例如,序列化可用于在 ASP.NET 中保存会话状态并将对象复制到 Windows 窗体的剪贴板中。远程处理还可以使用序列化通过值将对象从一个应用程序域传递到另一个应用程序域中。
  公共语言运行时 (CLR) 管理对象在内存中的分布,.NET 框架则通过使用反射提供自动的序列化机制。对象序列化后,类的名称、程序集以及类实例的所有数据成员均被写入存储媒体中。对象通常用成员变量来存储对其他实例的引用。类序列化后,序列化引擎将跟踪所有已序列化的引用对象,以确保同一对象不被序列化多次。.NET 框架所提供的序列化体系结构可以自动正确处理对象图表和循环引用。对对象图表的唯一要求是,由正在进行序列化的对象所引用的所有对象都必须标记为 Serializable(请参阅基本序列化)。否则,当序列化程序试图序列化未标记的对象时将会出现异常。
  当反序列化已序列化的类时,将重新创建该类,并自动还原所有数据成员的值。
  3.如何实现对象的序列化及反序列化
  要实现对象的序列化,首先要保证该对象可以序列化。而且,序列化只是将对象的属性进行有效的保存,对于对象的一些方法则无法实现序列化的。
  实现一个类可序列化的最简便的方法就是增加Serializable属性标记类。如:
  [Serializable()]
  public class MEABlock
  private int m_ID;
  public string C
  public MEABlock()
  ///构造函数
  即可实现该类的可序列化。注意序列化的类必须为Public,否则不能够被序列化。
  要将该类的实例序列化为到文件中?.NET FrameWork提供了两种方法:
  a .XML序列化
  使用 XmLSerializer 类,可将下列项序列化。
  公共类的公共读/写属性和字段
  实现 ICollection 或 IEnumerable 的类。(注意只有集合会被序列化,而公共属性却不会。)
  XmlElement 对象。
  XmlNode 对象。
  DataSet 对象。
  要实现上述类的实例的序列化,可参照如下例子:
  MEABlock myBlock = new MEABlock();
  // Insert code to set properties and fields of the object.
  XmlSerializer mySerializer = new XmlSerializer(typeof(MEABlock));
  // To write to a file, create a StreamWriter object.
  StreamWriter myWriter = new StreamWriter("myFileName.xml");
  mySerializer.Serialize(myWriter, MEABlock);
  需要注意的是XML序列化只会将public的字段保存,对于私有字段不予于保存。
  生成的XML文件格式如下:
  &MEABlock&
  &Caption&Test&/Caption&
  &/MEABlock&
  对于对象的反序列化,则如下:
  MEABlock myB
  // Constructs an instance of the XmlSerializer with the type
  // of object that is being deserialized.
  XmlSerializer mySerializer = new XmlSerializer(typeof(MEABlock));
  // To read the file, creates a FileStream.
  FileStream myFileStream = new FileStream("myFileName.xml", FileMode.Open);
  // Calls the Deserialize method and casts to the object type.
  myBlock = (MEABlock)mySerializer.Deserialize(myFileStream)
  b. 二进制序列化
  与XML序列化不同的是,二进制序列化可以将类的实例中所有字段(包括私有和公有)都进行序列化操作。这就更方便、更准确的还原了对象的副本。
  要实现上述类的实例的序列化,可参照如下例子:
  MEABlock myBlock = new MEABlock();
  // Insert code to set properties and fields of the object.
  IFormatter formatter = new BinaryFormatter();
  Stream stream = new FileStream("MyFile.bin",FileMode.Create,FileAccess.Write, FileShare.None);
  formatter.Serialize(stream, myBlock);
  stream.Close();
  对于对象的反序列化,则如下:
  IFormatter formatter = new BinaryFormatter();
  Stream stream = new FileStream("MyFile.bin", FileMode.Open,FileAccess.Read, FileShare.Read);
  MEABlock myBlock = (MEABlock) formatter.Deserialize(stream);
  stream.Close();
  4、如何变相实现自定义可视化控件的序列化、反序列化
  对于WinForm中自定义控件,由于继承于System.Windows.Form类,而Form类又是从MarshalByRefObject继承的,窗体本身无法做到序列化,窗体的实现基于Win32下GUI资源,不能脱离当前上下文存在。
  当然可以采用变通的方法实现控件的序列化。这里采用的是记忆类模型。
  定义记忆类(其实就是一个可序列化的实体类)用于记录控件的有效属性,需要序列化控件的时候,只需要将该控件的实例Copy到记忆类,演变成序列化保存该记忆类的操作。
  反序列化是一个逆过程。将数据流反序列化成为该记忆类,再根据该记忆类的属性生成控件实例。而对于控件的一些事件、方法则可以继续使用。
  wwf之所以强调要把类实例化,就是因为工作流和应用程序是在不同的线程中。二者之间需要用类作为传递数据的载体的话,就需要把该类定义为public序列化为二进制传输。
&&&主编推荐
&&&热门试卷
&&&最新视频
&&&热门阅读
&&&最新问答
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&&&湘教QS2-164&&增值电信业务经营许可证湘B2-Serializable实体类序列化介绍, serializable接口,serializable 作用, serializab..
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
Serializable实体类序列化介绍
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口c#.net实体类序列化方法  为什么要序列化_小组_ThinkSAAS
c#.net实体类序列化方法  为什么要序列化
c#.net实体类序列化方法  为什么要序列化
  提到为了传递数据,需要把作为载体的实体类序列化,好好的找了一些序列化方面的介绍。感觉下面的这个介绍比较容易介绍!
  1.什么是序列化
  序列化是将对象状态转换为可保持或传输的格式的过程,在序列化过程中,对象的公共字段和私有字段以及类的名称(包括包含该类的程序集)都被转换为字节流,然后写入数据流。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。
  2.为什么使用序列化
  a. 一个原因是将对象的状态保持在存储媒体中,以便可以在以后重新创建精确的副本。
  我们经常需要将对象的字段值保存到磁盘中,并在以后检索此数据。尽管不使用序列化也能完成这项工作,但这种方法通常很繁琐而且容易出错,并且在需要跟踪对象的层次结构时,会变得越来越复杂。可以想象一下编写包含大量对象的大型业务应用程序的情形,程序员不得不为每一个对象编写代码,以便将字段和属性保存至磁盘以及从磁盘还原这些字段和属性。序列化提供了轻松实现这个目标的快捷方法。
  b.另一个原因是通过值将对象从一个应用程序域发送到另一个应用程序域中。
  例如,序列化可用于在 ASP.NET 中保存会话状态并将对象复制到 Windows 窗体的剪贴板中。远程处理还可以使用序列化通过值将对象从一个应用程序域传递到另一个应用程序域中。
  公共语言运行时 (CLR) 管理对象在内存中的分布,.NET 框架则通过使用反射提供自动的序列化机制。对象序列化后,类的名称、程序集以及类实例的所有数据成员均被写入存储媒体中。对象通常用成员变量来存储对其他实例的引用。类序列化后,序列化引擎将跟踪所有已序列化的引用对象,以确保同一对象不被序列化多次。.NET 框架所提供的序列化体系结构可以自动正确处理对象图表和循环引用。对对象图表的唯一要求是,由正在进行序列化的对象所引用的所有对象都必须标记为 Serializable(请参阅基本序列化)。否则,当序列化程序试图序列化未标记的对象时将会出现异常。
  当反序列化已序列化的类时,将重新创建该类,并自动还原所有数据成员的值。
  3.如何实现对象的序列化及反序列化
  要实现对象的序列化,首先要保证该对象可以序列化。而且,序列化只是将对象的属性进行有效的保存,对于对象的一些方法则无法实现序列化的。
  实现一个类可序列化的最简便的方法就是增加Serializable属性标记类。如:
  [Serializable()]
  public class MEABlock
  private int m_ID;
  public string C
  public MEABlock()
  ///构造函数
  即可实现该类的可序列化。注意序列化的类必须为Public,否则不能够被序列化。
  要将该类的实例序列化为到文件中?.NET FrameWork提供了两种方法:
  a .XML序列化
  使用 XmLSerializer 类,可将下列项序列化。
  公共类的公共读/写属性和字段
  实现 ICollection 或 IEnumerable 的类。(注意只有集合会被序列化,而公共属性却不会。)
  XmlElement 对象。
  XmlNode 对象。
  DataSet 对象。
  要实现上述类的实例的序列化,可参照如下例子:
  MEABlock myBlock = new MEABlock();
  // Insert code to set properties and fields of the object.
  XmlSerializer mySerializer = new XmlSerializer(typeof(MEABlock));
  // To write to a file, create a StreamWriter object.
  StreamWriter myWriter = new StreamWriter("myFileName.xml");
  mySerializer.Serialize(myWriter, MEABlock);
  需要注意的是XML序列化只会将public的字段保存,对于私有字段不予于保存。
  生成的XML文件格式如下:
  &MEABlock&
  &Caption&Test&/Caption&
  &/MEABlock&
  对于对象的反序列化,则如下:
  MEABlock myB
  // Constructs an instance of the XmlSerializer with the type
  // of object that is being deserialized.
  XmlSerializer mySerializer = new XmlSerializer(typeof(MEABlock));
  // To read the file, creates a FileStream.
  FileStream myFileStream = new FileStream("myFileName.xml", FileMode.Open);
  // Calls the Deserialize method and casts to the object type.
  myBlock = (MEABlock)mySerializer.Deserialize(myFileStream)
  b. 二进制序列化
  与XML序列化不同的是,二进制序列化可以将类的实例中所有字段(包括私有和公有)都进行序列化操作。这就更方便、更准确的还原了对象的副本。
  要实现上述类的实例的序列化,可参照如下例子:
  MEABlock myBlock = new MEABlock();
  // Insert code to set properties and fields of the object.
  IFormatter formatter = new BinaryFormatter();
  Stream stream = new FileStream("MyFile.bin",FileMode.Create,FileAccess.Write, FileShare.None);
  formatter.Serialize(stream, myBlock);
  stream.Close();
  对于对象的反序列化,则如下:
  IFormatter formatter = new BinaryFormatter();
  Stream stream = new FileStream("MyFile.bin", FileMode.Open,FileAccess.Read, FileShare.Read);
  MEABlock myBlock = (MEABlock) formatter.Deserialize(stream);
  stream.Close();
  4、如何变相实现自定义可视化控件的序列化、反序列化
  对于WinForm中自定义控件,由于继承于System.Windows.Form类,而Form类又是从MarshalByRefObject继承的,窗体本身无法做到序列化,窗体的实现基于Win32下GUI资源,不能脱离当前上下文存在。
  当然可以采用变通的方法实现控件的序列化。这里采用的是记忆类模型。
  定义记忆类(其实就是一个可序列化的实体类)用于记录控件的有效属性,需要序列化控件的时候,只需要将该控件的实例Copy到记忆类,演变成序列化保存该记忆类的操作。
  反序列化是一个逆过程。将数据流反序列化成为该记忆类,再根据该记忆类的属性生成控件实例。而对于控件的一些事件、方法则可以继续使用。
  wwf之所以强调要把类实例化,就是因为工作流和应用程序是在不同的线程中。二者之间需要用类作为传递数据的载体的话,就需要把该类定义为public序列化为二进制传输。
用户评论(0)
开发技术学习小组列表
PHP开发框架
缓存Memcache
服务器环境
ThinkSAAS商业授权:
ThinkSAAS为用户提供有偿个性定制开发服务
ThinkSAAS将为商业授权用户提供二次开发指导和技术支持
手机客户端
ThinkSAAS接收任何功能的Iphone(IOS)和Android手机的客户端定制开发服务
让ThinkSAAS更好,把建议拿来。
iphone扫码下载客户端iOS中复杂实体类对象的json序列化
由于项目需要在做ios客户端时,与服务器通信是基于webservice的,而且数据交互都是使用json序列化后的字符串,这样就只需要双方解析json字符串为一个实体类就可以得到所需要的数据
社区成员:haoero
由于项目需要在做ios客户端时,与服务器通信是基于webservice的,而且数据交互都是使用json序列化后的字符串,这样就只需要双方解析json字符串为一个实体类就可以得到所需要的数据(至于与xml通信方式比较的优劣我在此不评论)。
而这种方式在java服务器端以及我之前做的android客户端都有成熟的框架,可以对自定义的复杂实体类进行json序列化以及对json字符串反序列化为目标实体类对象!在ios端貌似没发现(如果有谁知道麻烦指点下啊!),而且本人刚入门ios开发,基本语法都不怎么了解,查找了好多资料也无头绪,对于自定义实体类的序列化工具也没找到,更别说反序列化工具了。
摸索几天后,借鉴网上以为仁兄发布的序列化普通实体类的方法才得以实现了我所需要的功能,引用下这位兄弟的成果, /bbs/read.php?tid=86667&page=1 他是利用了obj c runtime将简单的自定义实体类对象转为了json字符串,但我是纯新手对obj c runtime之类的不怎么了解,我也没时间深究咯。
先说下我对于ios中生成json字符串的理解,ios中利用了NSDictionary这种类型,先将一个个键值对构造成一个NSDictionary对象,然后再利用NSJSONSerialization 将其转为NSData类型数据,之后将其转为NSString字符串,这样便可以生成json格式的字符串了。
在详细查看了上面那位前辈的代码后,发现对于项目中的许多普通实体类的序列化也算减轻了不少工作量,但是对于复杂的嵌套实体类这种方式就失败了,更别说里面还包含NSArray的实体类数组名了,而我们的项目就刚好需要如此,上报数据时本来就包含了很多复杂字段的。
于是只好将复杂实体类中嵌套实体类先序列化后再用最基本的方法构造键值对,生成NSDictionary。最后我将生成的字符串打印出来,问题来了,下面是我得到的字符串:
{&customerName&:&haoero&,&location&:{\&longitude\&:50.98988,\&address\&:\&武汉华科\&,\&latitude\&:100.9899},&customerId&:50,&customerNo&:&A110&}
注意观察就可以发现这已经不符合json字符串的格式了,中间多了转义符\ 。因为在对嵌套的实体类 Location序列化后得到的json字符串应该是{&longitude&:50.98988,&address&:&武汉华科&,&latitude&:100.9899},这是用前辈的方式得到的,本身没错,但当把他们赋值给NSDictionary的location这个key后,这里便会把里面有引号的地方来了个转义符,因为每个key和value的最外层都已经有了一个&&,由此造成了冲突,当然在此可以一个个去把最终的字符串去掉转义符,只是这样带来的不便也可想而知。
另外当遇到有包含NSArray的实体类数组的情况时,这样一个个构造时,还要加入[]来包含里面的各个实体类字符串,这样也会是非常的麻烦的;于是我想干脆把前辈的方法重写一下,只是像java里反序列化时传入嵌套实体类的类型class,这样就可以利用已有的方法加上一个递归调用,便可以实现对于复杂嵌套实体类的序列化了,下面是我改写前辈那个方法后的代码(希望前辈谅解):
//& serializeObjectWithChildObjectsAndComplexArray
//& 参数:complexObject, 需要序列化的复杂实体类对象
//& 参数:childSimpleClasses,所有嵌套的简单实体类的类型,形如【NSString class】
//& 参数:childSimpleClassInArray,所有嵌套在数组里的简单实体类类型,形如【NSString class】
//& Created by haoero on 2012-10
- (NSString *)serializeObjectWithChildObjectsAndComplexArray:(id)complexObject :(NSArray*)childSimpleClasses :(NSArray*) childSimpleClassInArray
&&& NSString *complexClassName = NSStringFromClass([complexObject class]);
&&& const char *cComplexClassName = [complexClassName UTF8String];
&&& id theComplexClass = objc_getClass(cComplexClassName);
&&& unsigned int outCount,
//获取当前实体类中所有属性名
&&& objc_property_t *properties = class_copyPropertyList(theComplexClass, &outCount);
//存放所有普通类型的属性变量名
&&& NSMutableArray *propertyNames = [[NSMutableArray alloc] initWithCapacity:1];
//存放所有数组类型的属性变量名
&&& NSMutableArray *childArrayPropertyNames = [[NSMutableArray alloc] initWithCapacity:1];
//存放所有数组类型变量对应的JSON字符串的
&&& NSMutableArray *childArrayJSONString& = [[NSMutableArray alloc] initWithCapacity:1];
//存放所有数组类型的属性变量名
&&& NSMutableArray *childClassesPropertyNames = [[NSMutableArray alloc] initWithCapacity:1];
//存放所有数组类型变量对应的JSON字符串的
&&& NSMutableArray *childClassesJSONString& = [[NSMutableArray alloc] initWithCapacity:1];
&&& for (i = 0; i & outC i++) {
&&&&&&& objc_property_t property =
NSString *propertyNameString =[[NSString alloc] initWithCString:property_getName(property) encoding:NSUTF8StringEncoding] ;
&&&&&&& SEL tempSelector = NSSelectorFromString(propertyNameString);
&&&&&&& id tempValue = [complexObject performSelector:tempSelector];
//如果目标实体类包含了嵌套实体类或者子实体类数组
&&&&&&& if (childSimpleClassInArray!=nil || childSimpleClasses!=nil) {
//如果当前属性类型是数组
&&&&&&&&&&& if ([tempValue isKindOfClass:[NSArray class]]) {
&&&&&&&&&&&&&&& NSArray *tempChildArray = (NSArray*)tempV&
&&&&&&&&&&&&&&& if ([tempChildArray count]&0) {
&&&&&&&&&&&&&&&&&&& //判断当前数组是否是目标类型数组
&&&&&&&&&&&&&&&&&&& int flag = 0;
&&&&&&&&&&&&&&&&&&& for (int j=0; j&[childSimpleClassInArray count]; j++) {
&&&&&&&&&&&&&&&&&&&&&&& //如果是目标类型数组,则改变flag的值
&&&&&&&&&&&&&&&&&&&&&&& if ([[tempChildArray objectAtIndex:0] isKindOfClass:[childSimpleClassInArray objectAtIndex:j]]) {
&&&&&&&&&&&&&&&&&&&&&&&&&&& flag = 1;
//则将属性变量名添加到childArrayPropertyNames
&&&&&&&&&&&&&&&&&&&&&&&&&&& [childArrayPropertyNames addObject:propertyNameString];
&&&&&&&&&&&&&&&&&&&&&&&&&&& NSMutableString *tempChildString = [[NSMutableString alloc] init];
&&&&&&&&&&&&&&&&&&&&&&&&&&& for (int m=0; m& [tempChildArray count]; m++) {
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& if (m == 0) {
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& [tempChildString appendFormat:@&[&];
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& }
//先序列化数组内单独, 在此可以针对不同情况修改第二,三个参数来递归调用
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& NSString *singleJSONStringInArray = [[SerializationComplexEntities sharedSerializer] serializeObjectWithChildObjectsAndComplexArray:[tempChildArray objectAtIndex:m] :childSimpleClasses :childSimpleClassInArray];
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& if (singleJSONStringInArray!=nil) {
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& [tempChildString appendFormat:singleJSONStringInArray];
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& if (m!= [tempChildArray count]-1) {
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& [tempChildString appendFormat:@&,&];
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& else {
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& [tempChildString appendFormat:@&]&];
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&&&&&&&&&&& //添加到存放子数组JSON字符串的数组里
&&&&&&&&&&&&&&&&&&&&&&&&&&& [childArrayJSONString addObject:tempChildString];&
&&&&&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&&& //如果是普通类型的数组
&&&&&&&&&&&&&&&&&&& if (flag == 0) {
//则将属性变量名添加到propertyNames
&&&&&&&&&&&&&&&&&&&&&&& [propertyNames addObject:propertyNameString];
&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&& }
&&&&&&&&&&& }&
//如果当前属性类型是除数组外的类型
&&&&&&&&&&& else {
&&&&&&&&&&&&&&& int isChildClass = 0;
&&&&&&&&&&&&&&& for (int p = 0; p & [childSimpleClasses count]; p++) {
&&&&&&&&&&&&&&&&&&& //判断是否是目标嵌套实体类
&&&&&&&&&&&&&&&&&&& if ([tempValue isKindOfClass:[childSimpleClasses objectAtIndex:p ]]) {&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&& isChildClass = 1;
&&&&&&&&&&&&&&&&&&&&&&& [childClassesPropertyNames addObject:propertyNameString];
//先序列化嵌套实体类, 在此可以针对不同情况修改第二个参数来递归调用
&&&&&&&&&&&&&&&&&&&&&&& NSString *singleJSONStringInChildClasses = [[SerializationComplexEntities sharedSerializer] serializeObjectWithChildObject:tempValue:nil];
&&&&&&&&&&&&&&&&&&&&&&& //添加到存放嵌套实体类的JSON字符串的数组里
&&&&&&&&&&&&&&&&&&&&&&& [childClassesJSONString addObject:singleJSONStringInChildClasses];
&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&& }
//如果当前属性类型除数组和目标嵌套子实体类外的普通类型
&&&&&&&&&&&&&&& if (isChildClass==0) {
&&&&&&&&&&&&&&&&&&& [propertyNames addObject:propertyNameString];
&&&&&&&&&&&&&&& }
&&&&&&&&&&& }
&&&&&&& }&&&&&&&&&&&&&&&&
//如果目标实体类不包含子实体类数组,则直接添加变量名
&&&&&&& else {
&&&&&&&&&&& [propertyNames addObject:propertyNameString];
//开始构造Dictionary
NSMutableDictionary *finalDict = [[NSMutableDictionary alloc] initWithCapacity:1];
//对所有子实体类数组
&&& for(NSString *key in childArrayPropertyNames)
//对数组变量的键值先暂时用一个字符串代替
&&&&&&& [finalDict setObject:[[NSString alloc] initWithFormat:@&NULL%@NULL&,key] forKey:key];
//对所有子实体类数组
&&& for(NSString *key in childClassesPropertyNames)
//对数组变量的键值先暂时用一个字符串代替
&&&&&&& [finalDict setObject:[[NSString alloc] initWithFormat:@&NULL%@NULL&,key] forKey:key];
&&& for(NSString *key in propertyNames)
&&&&&&& SEL selector = NSSelectorFromString(key);
&&&&&&& id value = [complexObject performSelector:selector];
&&&&&&& if (value == nil)
&&&&&&&&&&& value = [NSNull null];
&&&&&&& [finalDict setObject:value forKey:key];
//没替换字符串的初始JSON字符串
NSMutableString *jsonString =[[NSMutableString alloc] initWithString: [[CJSONSerializer serializer] serializeDictionary:finalDict]];
//将数组变量的键值字符串替换成之前序列化的字符串
&&& for(int m=0; m&childArrayJSONString. m++)
&&&&&&& if ([childArrayJSONString objectAtIndex:m] !=nil) {
&&&&&&&&&&& NSString *tempStringToBeReplaced = [[NSString alloc] initWithFormat:@&\&NULL%@NULL\&&,[childArrayPropertyNames objectAtIndex:m]];&&&&&&&&&&&
&&&&&&&&&&& jsonString = [[NSMutableString alloc] initWithString:[jsonString stringByReplacingOccurrencesOfString:tempStringToBeReplaced withString:[childArrayJSONString objectAtIndex:m]]];
&&&&&&& }&&&&&
//将数组变量的键值字符串替换成之前序列化的字符串
&&& for(int m=0; m&childClassesJSONString. m++)
&&&&&&& if ([childClassesJSONString objectAtIndex:m] !=nil) {
&&&&&&&&&&& NSString *tempStringToBeReplaced = [[NSString alloc] initWithFormat:@&\&NULL%@NULL\&&,[childClassesPropertyNames objectAtIndex:m]];&&&&&&&&&&&
&&&&&&&&&&& jsonString = [[NSMutableString alloc] initWithString:[jsonString stringByReplacingOccurrencesOfString:tempStringToBeReplaced withString:[childClassesJSONString objectAtIndex:m]]];
&&&&&&& }&&&&&
&&& return jsonS
当然我这里用了一个比较笨的方法,是先将复杂嵌套实体类属性对应的value先赋值为一个特殊的字符串,之后再将其替换即可,当然这只是小弟的无奈之举,也算实现了基本的要求,还有效率方面的问题由于项目赶得紧,还没有测试,以后再加上吧。
社区原帖:
关注微信 每日推荐
扫一扫 浏览移动版

我要回帖

更多关于 安卓intent 的文章

 

随机推荐