协议缓冲区:使用byte []从Java到Objective-C

时间:2012-08-12 21:52:52

标签: java objective-c encoding protocol-buffers

我目前正在使用谷歌的协议缓冲区。它在Java和C#之间轻松地工作,但是我遇到了试图与Obj-c实现相同用途的问题。

Java WS返回一个byte []。使用协议缓冲区API的代码非常简单:

productGroup.toByteArray();

我能够使用Skeet的C#端口重新创建对象,使用:

byte[] result = searchWebService.SearchProductsProtocolBuffer(search);
ProductProtoGroup products = ProductProtoGroup.ParseFrom(result);

但是,在obj-c方面,我正在努力处理返回值。

我从同一个Web服务RPC收到的NSString是:

CmYKEzgwMDAwMUFELTEzMjUyNzk5MTQySUZPT0QgJiBCRV...

我不太清楚如何处理这个问题,因为我不知道它是什么,除了它是从一个字节数组生成的。我尝试使用

将其直接解析为NSData
NSData* data = [returnValue dataUsingEncoding:NSUTF8StringEncoding];

但在[ProductProtoGroup parseFromData:data];上,我得到InvalidProtocolBuffer

我已经在Java端检查了原始byte[]的字节字符串/十六进制表示,它与我从ws收到的字符串不匹配。

十六进制是0-F。也许每个字节都转换为char?不,那不匹配。

任何帮助都将不胜感激。

戴恩

2 个答案:

答案 0 :(得分:1)

有一个更新鲜的头脑和一些有用的评论,我终于明白了。

我想知道Web服务如何在Java中自动发送byte [],然后在C#中重新构建它,以及稍后如何存储此消息。

结果是字符串,

CmYKEzgwMDAwMUFELTEzMjUyNzk5MTQySUZPT0QgJiBCRV...

确实是在肥皂信封中发送的东西。因此,在Java和传输中创建byte []之间,发生了一些事情。查看C#中的消息处理程序,

[System.Web.Services.Protocols.SoapDocumentMethodAttribute("", 
    RequestNamespace="x", ResponseNamespace="x", 
    Use=System.Web.Services.Description.SoapBindingUse.Literal, 
   ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
[return: System.Xml.Serialization.XmlElementAttribute("return",
   Form=System.Xml.Schema.XmlSchemaForm.Unqualified, 
   DataType="base64Binary", IsNullable=true)]
public byte[] searchProductProtocolBuffer([System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] string arg0)
{
   object[] results = this.Invoke("searchProductProtocolBuffer", new object[] {
                    arg0});
   return ((byte[])(results[0]));
}

所以base64Binary!,我承认这是第一次见面。 Skeet说,这是最安全的方式:

How can I safely convert a byte array into a string and back?

因此,知道编码后,解决方案变得直截了当。使用此问题的答案中提供的算法:How do I do base64 encoding on iphone-sdk?,我的最终代码变为:

NSString* returnValue = [WebServiceUtil processStringReturnValue:value];
NSData* data = [Encoding base64DataFromString:returnValue];
ProductProtoGroup* products = [ProductProtoGroup parseFromData:data];

答案 1 :(得分:0)

我对Objective C知之甚少,但NSString不是字节数组。您是否尝试使用-[NSString UTF8String]将NSString转换为char *?