Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Sending a serialized object from Android to a servlet using HTTP client

I have tried to create a android application that sends a serialzed object from the phone to a servlet the contents of the object is the input from the user which i will store in a database using hibernate. I believe the problem is around the serializing and deserializing of the object the code is below. If anyone could help i would very greatful.

p.s the class User implements the serializable interface

client

    public class Adduser extends Activity implements OnClickListener {

 EditText uname;
 EditText password;
 EditText rating;
 EditText date;
 Button add;
 User user;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        uname = (EditText) findViewById(R.id.Usernamei);
        password = (EditText) findViewById(R.id.passwordi);
        rating = (EditText) findViewById(R.id.ratingi);
        date = (EditText) findViewById(R.id.datei);
        add = (Button) findViewById(R.id.Adduser);

        user = new User();



        add.setOnClickListener(this);

    }

 @Override
 public void onClick(View v) {

  user.setusername(uname.getText().toString());
        user.setpassword(password.getText().toString());
        user.setdate(date.getText().toString());
        user.setrating(rating.getText().toString());

  HttpClient httpClient = new DefaultHttpClient();
  ObjectOutput out;

  try{
    String url = "MY URL goes here";

    HttpPost post = new HttpPost(url);


    //Serialisation of object
    ByteArrayOutputStream bos = new ByteArrayOutputStream() ;
       out = new ObjectOutputStream(bos) ;
       out.writeObject(user);

       //puts bytes into object which is the body of the http request
       post.setHeader(new BasicHeader("Content-Length", "" + bos.toByteArray().length));

       ByteArrayEntity barr = new ByteArrayEntity(bos.toByteArray()); 
       //sets the body of the request 
       post.setEntity(barr);

       out.close();
       //executes request and returns a response
       HttpResponse response = httpClient.execute(post); 

  } catch (IOException e) {
        Log.e( "ouch", "!!! IOException " + e.getMessage() );
     }

  uname.setText(String.valueOf(""));
  password.setText(String.valueOf(""));
  rating.setText(String.valueOf(""));
  date.setText(String.valueOf(""));

 }
}



Server side

    public class Adduser extends HttpServlet {

 //logger for properties file
 //private static Logger logger = Logger.getLogger(Adduser.class);



 public void doPost (HttpServletRequest request, HttpServletResponse response) throws ServletException {
  //test
  //logger.warn("this is a sample log message.");


  String usern = null;
  String password = null;
  String rating = null;
  String date = null;

  InputStream in;
  try {
   //gets http content body byte array should be on the stream
   in = request.getInputStream();

   //int bytesToRead;
   //bytesToRead =  Integer.parseInt(request.getHeader("Content-Length"));


   //reads inputream contents into bytearray
   int bytesRead=0;
   int bytesToRead=1024;
   byte[] input = new byte[bytesToRead];
   while (bytesRead < bytesToRead) {
     int result = in.read(input, bytesRead, bytesToRead - bytesRead);
     if (result == -1) break;
     bytesRead += result;
   }



   //passes byte array is passed into objectinput stream 
   ObjectInputStream inn = new ObjectInputStream(new ByteArrayInputStream(input));
   User users = null;
   try {
    //object is read into user object and cast
    users = (User)inn.readObject();
   } catch (ClassNotFoundException e1) {
    // TODO Auto-generated catch block
    System.out.println(e1.getMessage());

   }
   in.close();
   inn.close();

   //contents of object is put into variables to be passed into database
   usern = users.getusername();
   password = users.getpassword();
   rating = users.getrating();
   date = users.getdate();

  } catch (IOException e2) {
   // TODO Auto-generated catch block
   System.out.println(e2.getMessage());
  }




  Session session = null;

  try{
   SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory(); 
   session = sessionFactory.openSession();
          //Create new instance of Contact and set 
   Transaction tx = session.beginTransaction();

      Userr user = new Userr();
      user.setusername(usern);
      user.setpassword(password);
      user.setrating(rating);
      user.setdate(date);
      session.save(user);

      tx.commit();
  }catch(Exception e){
        System.out.println(e.getMessage());
      }finally{
        // Actual contact insertion will happen at this step

        session.flush();
        session.close();

        }

 }




 }
like image 576
Shino88 Avatar asked Jan 05 '10 22:01

Shino88


2 Answers

As suggested, use XML or JSON. You can get XStream patched for Android from this blog in order to serialize your objects to XML.

like image 59
Bozho Avatar answered Nov 20 '22 07:11

Bozho


Don't use serialization between architectures. Use JSON, XML, or something else that is architecture-neutral.

like image 1
CommonsWare Avatar answered Nov 20 '22 08:11

CommonsWare