2012-08-28 74 views
0

我使用kvm序列化从我的android应用程序调用java soap webservices。我的POJO类和代码如下,Android webservice ksoap2 - pojo内的byte []错误

DataSet.java

public class DataSet implements KvmSerializable{ 

public String client = null; 
public Photo[] images; 
public String userId = null; 

@Override 
public Object getProperty(int arg0) { 
    switch (arg0){ 
    case 0: 
     return client;  
    case 1: 
     return images; 
    case 2: 
     return userId; 
    default: 
     return null; 
    } 
} 

@Override 
public int getPropertyCount() { 
    // TODO Auto-generated method stub 
    return 3; 
} 

@Override 
public void getPropertyInfo(int index, Hashtable arg1, PropertyInfo info) { 
    switch(index) 
    { 
    case 0: 
     info.type = PropertyInfo.STRING_CLASS; 
     info.name = "client"; 
     break;   
    case 1: 
     info.type = Photo.class; 
     info.name = "images"; 
    case 2: 
     info.type = PropertyInfo.STRING_CLASS; 
     info.name = "userId"; 
    default: 
     break; 
    } 

} 

@Override 
public void setProperty(int index, Object value) { 
    switch(index) 
    { 
    case 0: 
     client = value.toString(); 
     break; 
    case 1: 
     images = (Photo[]) value; 
     break; 
    case 2: 
     userId = value.toString(); 
     break; 
    default: 
     break; 
    } 

} 

}

和Photo.java

public class Photo implements KvmSerializable{ 

public byte[] data; 
public String name; 

@Override 
public Object getProperty(int arg0) { 
    switch (arg0){ 
    case 0: 
     return data;   
    case 1: 
     return name;   
    default: 
     return null; 
    } 
} 

@Override 
public int getPropertyCount() { 
    // TODO Auto-generated method stub 
    return 2; 
} 

@Override 
public void getPropertyInfo(int index, Hashtable arg1, PropertyInfo info) { 
    switch(index) 
    { 
    case 0: 
     info.type = byte[].class; 
     info.name = "data"; 
     break;   
    case 1: 
     info.type = PropertyInfo.STRING_CLASS; 
     info.name = "name"; 
    default: 
     break; 
    } 

} 

@Override 
public void setProperty(int index, Object value) { 
    switch(index) 
    { 
    case 0: 
     data = (byte[])value; 
     break; 
    case 1: 
     name = value.toString(); 
     break; 
    default: 
     break; 
    } 

} 

在此我存储的图像和名称到照片.java POJO然后设置成DataSet POJO as,

public class Sample implements Runnable { 
    ... 
    ... 
    Photo[] photoArr = new Photo[3]; 
    int count = 0; 

public void run() { 
    while (count < 3) { 
    .... 
    .... 
    .... 
    byte[] byteArray = stream.toByteArray(); 
    Photo photo = new Photo(); 
    photo.data = byteArray; 
    photo.name = "img"+count; 
    photoArr[count] = photo; 
    count++; 
} 
     if(count == 2) 
     { 
      SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); 
      SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
      new MarshalBase64().register(envelope); //serialization 
      envelope.encodingStyle = SoapEnvelope.ENC; 


      PropertyInfo pi = new PropertyInfo(); 
      DataSet dataSet = new DataSet(); 
      dataSet.client = "1"; 
      dataSet.userId = "1"; 
      dataSet.images = photoArr; 

      pi.setName("dataSet"); 
      pi.setValue(dataSet); 
      pi.setType(dataSet.getClass()); 
      request.addProperty(pi); 

      envelope.setOutputSoapObject(request); 
      envelope.addMapping(NAMESPACE, "dataSet", DataSet.class); 
      envelope.addMapping(NAMESPACE, "images", Photo.class); 

      AndroidHttpTransport httpTransport = new AndroidHttpTransport(URL); 
      httpTransport.debug = true;       
      httpTransport.call(SOAP_ACTION, envelope); 

      SoapObject result = (SoapObject) envelope.bodyIn; 
     Log.d("Result: ", result.toString()); 
     } 

}

但我收到以下错误无法序列:[Lcom.common.Photo; @ 41221270

我的代码有什么问题。我已经搜寻过这个问题。但我没有得到正确答案。 任何人都可以帮我解决这个问题吗?

回答

2

在你的照片类的为getPropertyInfo方法,对数据属性的类型从

byte[].class

改变

MarshalBase64.BYTE_ARRAY_CLASS

更改值分配中的setProperty到

data = Base64.decode(value.toString(), Base64.DEFAULT);

编辑回应您的评论:

您还需要创建一个PhotoList类:

public class PhotoList extends Vector<Photo> implements 
    KvmSerializable { 

private static final long serialVersionUID = 12345L; // you can let the IDE generate this 

@Override 
public Object getProperty(int index) { 
    return this.get(index); 
} 

@Override 
public int getPropertyCount() { 
    return this.size(); 
} 

@Override 
public void setProperty(int index, Object value) { 
    this.add((Photo) value); 
} 

@Override 
public void getPropertyInfo(int index, Hashtable properties, 
     PropertyInfo info) { 
    info.name = "Photo"; 
    info.type = Photo.class; 
} 
} 

更改您的DataSet类的实现,所以图像的类型是PhotoList并初始化它。还要更改getPropertyInfo/setProperty方法中的类型。

PhotoList images = new PhotoList(); 
... 
info.type = PhotoList.class; 
... 
images = (PhotoList)value; 

您还需要将PhotoList映射添加到SOAP信封中。

+0

是的,我编辑了一些额外的变化。 – Jason

+0

在setProperty“this.add((Photo)value);”显示一些错误。当我点击quickfix时,这将变成“this.add((PhotoList)的值);” – Manoj

+0

对不起,错字 - 类应扩展矢量不是矢量。 – Jason