rafi73 / ksoap2-android

Automatically exported from code.google.com/p/ksoap2-android
2 stars 8 forks source link

Ksoap does not generate request xml for nested classes. #90

Closed GoogleCodeExporter closed 9 years ago

GoogleCodeExporter commented 9 years ago
What steps will reproduce the problem?
1.The request object should contain attributes say atb1,  atb2, another class 
object class1obj and class1obj contains class2obj 
2.
3.

What is the expected output? What do you see instead?
The request xml should be genereated as 
<Request>
   </attr1>
   </attr2>
   <class1obj>
       </class1atr1>
       </class1atr2>
       <class2obj>
           </class2atr1>
           </class2atr2>
       </class2obj>
   </class1obj>
</Request>

It is generating 
<Request>
   </attr1>
   </attr2>
   <class1obj>
       </class1atr1>
       </class1atr2>
   </class1obj>
</Request>

What version of the product are you using? On what operating system?
ksoap2-android-assembly 2.5.7

Please provide any additional information below.

Original issue reported on code.google.com by manishos...@gmail.com on 9 Nov 2011 at 1:17

GoogleCodeExporter commented 9 years ago
When you want to pass object of a class to webservice as agrument of a method .
And all class you want to transfer to web service must be serializable.
So, 
- You must:
  +create a class implement from KvmSerializable class and implement base method as needed to tell for Ksoap know how to serialize your class.
  + If class member variable have type as a class .It must be  serializable.
  + Finally. using addMapping method of SoapSerializationEnvelope to add your class to ksoap to can transfer it throught wweb service.

Example:
I have a class call Account:
public class Account
{
   private String mUser;
   private String mPass;
   private NoteType note;
}
and NoteType is my class :
public class NoteType {

    private String mSubject;
    private String mText;
}

--> I want to transert Account object to web service throught function :
 bool signIn(Account acc) ( web service method )

I must change:
 public class NoteType implements KvmSerializable{

    private String mSubject;
    private String mText;

    public NoteType(){
        this.setSubject("");
        this.setText("");
    }

    public NoteType(String s,String t){
        this.setSubject(s);
        this.setText(t);
    }
    @Override
    public Object getProperty(int index) {
        switch(index)
        {
        case 0:
            return this.getSubject();
        case 1:
            return this.getText();
        }
        return null;
    }

    @Override
    public int getPropertyCount() {
        return 2;
    }

    @Override
    public void getPropertyInfo(int index, Hashtable arg1, PropertyInfo info) {
        switch(index)
        {
        case 0:
            info.name="subject";
            info.type=PropertyInfo.STRING_CLASS;
            break;
        case 1:
            info.name="text";
            info.type=PropertyInfo.STRING_CLASS;
            break;
        }
    }

    @Override
    public void setProperty(int index, Object value) {
        switch(index)
        {
        case 0:
            this.setSubject(value.toString());
            break;
        case 1:
            this.setText(value.toString());
            break;
        }
    }

    public void setSubject(String mSubject) {
        this.mSubject = mSubject;
    }

    public String getSubject() {
        return mSubject;
    }

    public void setText(String mText) {
        this.mText = mText;
    }

    public String getText() {
        return mText;
    }

}

public class Account implements KvmSerializable
{

    private String mUser;
    private String mPass;
    private NoteType note;
    public NoteType getNote() {
        return note;
    }
    public void setNote(NoteType note) {
        this.note = note;
    }
    public Account()
    {
        this.setUser("");
        this.setPass("");
    }
    public Account(String u,String p)
    {
        this.setUser(u);
        this.setPass(p);
    }

    public String getUser() {
        return mUser;
    }
    public void setUser(String user) {
        this.mUser = user;
    }
    public String getPass() {
        return mPass;
    }
    public void setPass(String pass) {
        this.mPass = pass;
    }
    @Override
    public Object getProperty(int propertyID) {
        switch(propertyID)
        {
        case 0:
            return this.getUser();

        case 1:
            return this.getPass();
        case 2:
            return this.getNote();
        }
        return null;
    }
    @Override
    public int getPropertyCount() {
        return 3;
    }
    /**
     * This is form of class in server ,
     * so properties must same with sever.
     */
    @Override
    public void getPropertyInfo(int propertyID, Hashtable arg1, PropertyInfo info) {
        switch(propertyID)
        {
        case 0:
            info.name="user";
            info.type=PropertyInfo.STRING_CLASS;
            break;
        case 1:
            info.name="pass";
            info.type=PropertyInfo.STRING_CLASS;
            break;
        case 2:
            info.name="note";
            info.type=NoteType.class;
            break;
        }
    }
    @Override
    public void setProperty(int propertyID, Object value) {
        switch(propertyID)
        {
        case 0:
            this.setUser(value.toString());
            break;
        case 1:
            this.setPass(value.toString());
            break;
        case 2:
            this.setNote(value);
            break;
        }
    }
}

And when i call using SoapSerializationEnvelope , HttpTransportSE :
SoapSerializationEnvelope envelope = new 
SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.addMapping(S_NAMESPACE, "Account",Account.class);  
envelope.addMapping(S_NAMESPACE, "NoteType",NoteType.class);

// Here i call 

Original comment by tauit.d...@gmail.com on 9 Nov 2011 at 3:10

GoogleCodeExporter commented 9 years ago
Thanks. It is working fine. 

Original comment by manishos...@gmail.com on 10 Nov 2011 at 6:23

GoogleCodeExporter commented 9 years ago
Wrong usage. Not an issue.

Original comment by mosa...@gmail.com on 18 Nov 2011 at 4:31