如何在Objective-C中反序列化对象

时间:2013-12-17 17:14:53

标签: objective-c wcf nsmutablearray generic-list

当我尝试使wcf方法工作时出错。其中一个参数是NSMutableArray,Object类型是TypeClass。我用NSMutableArray检查了一切,一切似乎都很好。

我的参数代码是:

NSData *myPostData = [[NSString stringWithFormat:@"{\"parameter1\":\"%@\"}",mynsmutablearraylist] dataUsingEncoding:NSUTF8StringEncoding];
NSMutableData *myMutablePostData = [NSMutableData dataWithData:myPostData];

wcf中的参数类型类似于List<类型类>

我可以看到mynsmutablearraylist的对象和键的值。但我不明白为什么它不起作用。

此wcf方法适用于Win8 metro应用程序,但我无法使其适用于IOS。

  

服务器在处理请求时遇到错误。该   异常消息是'格式化程序在尝试时抛出异常   反序列化消息:尝试时出错   反序列化参数http://tempuri.org/:typeclass。该   InnerException消息是'反序列化时出错   对象类型   System.Collections.Generic.List`1 [ServiceOfMine.Entities.TypeClass,   ServiceOfMine,Version = 1.0.0.0,Culture = neutral,   公钥=空]。遇到无效字符'      '&#39 ;.有关详细信息,请参阅InnerException。'。查看服务器日志   更多细节。异常堆栈跟踪是:

已添加信息

当我使用完全相同的值测试参数时,它工作正常。 SOAPUI中Request的部分:

> >....
> >      <tem: parameter4>parvalue</tem: parameter4>
> >      < tem: typeclass>
> >         <!--Zero or more repetitions:-->
> >         <ser:TypeClass>
> >            
> >            <ser:drugId></ser:drugId>
> >            <ser:drugname></ser:drugname>
> >         </ser:TypeClass>
> >         <ser:TypeClass>
> >            
> >            <ser:drugId></ser:drugId>
> >            <ser:drugname></ser:drugname>
> >         </ser:TypeClass>
> >      </ tem: typeclass>
> >      ...

1 个答案:

答案 0 :(得分:2)

根据原始问题的@"{\"parameter1\":\"%@\"}"格式字符串,我假设您正在尝试构建JSON请求。但这可能不是创建JSON请求的最佳方式,因此我的原始答案(如下)侧重于如何正确构建JSON请求。

但要退一步,至少有三种不同类型的常见Web服务接口:

  • JSON,我(或许是错误的)根据您的原始问题推断出您想要的,因此我的原始答案如下;

  • XML,您修改过的问题表明您可能需要SOAP请求;或

  • 某些标准HTTP请求(例如application/x-www-form-urlencoded或其他常见变体)。

无论您尝试使用stringWithFormat进行哪种操作,使用%@ NSMutableArray参数无疑是错误的。

所以,问题恰恰是请求需要的格式。如果您在修改后的问题建议中需要创建SOAP请求,则需要手动构建,自己添加XML标记,或者必须使用某些库。如果您在Mac OS X上执行此操作,请参阅Web Services Core Programming Guide。如果您正在使用iOS,则必须找到第三方库。也许这个Stack Overflow问题是一个很好的起点:How to access SOAP services from iPhone。或者搜索Stack Overflow为“[ios] soap request”,你会获得很多其他点击。

就个人而言,当从iOS应用程序测试SOAP服务时,我已经手动构建了请求,但它很笨拙和笨拙。如果您的Web服务提供了JSON接口,那么这可能是更好的选择,因为这是一个具有更大iOS支持的接口。

无论如何,我的原始答案,显示如何为JSON请求构建POST正文如下。


原始答案:

如果没有关于请求的完整格式的更多详细信息,我们就无法获得更具体的信息,但如果您只是尝试创建JSON请求,则可以使用{{1}创建NSData },而不是NSJSONSerialization,例如可能会做类似的事情:

stringWithFormat

您还可以参考“NSDictionary *dictionary = @{@"parameter1": mynsmutablearraylist, @"parameter2": someOtherObject}; NSError *error = nil; NSData *postData = [NSJSONSerialization dataWithJSONObject:dictionary options:0 error:&error]; NSAssert(postData, @"%s: dataWithJSONObject error: %@", __FUNCTION__, error); ”的“对象和键”,但我对名称感到困惑(这表示它是mynsmutablearraylist并且您对“对象和键”的引用)。但我假设这是一个数组字典,在这种情况下上面的语法仍然有效。但是,如果不确切地知道您的服务正在寻找什么,就很难说。

我也不明白为什么你要创建NSMutableArray再现,但是如果你试图为这个JSON添加更多参数,你真的应该先将它们添加到原始字典然后再使用{ {1}}一旦你以JSON格式完全构建了你想要的字典/数组结构。例如:

NSMutableData