2010-01-05 2 views
5

ich versucht habe, eine Android-Anwendung zu erstellen, die vom Telefon zu einem Servlet der Inhalt des Objekts ein serialzed Objekt sendet, ist die Eingabe von dem Benutzer, die i speichert in eine Datenbank mit Hibernate. Ich glaube, das Problem liegt in der Serialisierung und Deserialisierung des Objekts, unter dem der Code liegt. Wenn jemand helfen könnte, würde ich sehr dankbar sein.Senden eines serialisierten Objekts von Android zu einem Servlet HTTP-Client

P. S die Klasse Benutzer die serializable Schnittstelle implementiert

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(); 

     } 

} 




} 

Antwort

3

Wie vorgeschlagen, die Verwendung von XML oder JSON. Sie können XStream für Android from this blog gepatcht bekommen, um Ihre Objekte in XML zu serialisieren.

1

nicht Serialisierung zwischen Architekturen anwenden. Verwenden Sie JSON, XML oder etwas anderes, das architekturneutral ist.

+0

Warum muss es architekturneutral sein, wenn das OP das Servlet steuert? – Rick

+2

@Rick: Das Servlet ist nicht das Problem. Kunden sind das Problem. Momentan denkt das OP ausschließlich an Android. Erstens gibt es keine Garantie, dass das Serialisierungsformat für Android dasselbe ist wie für den Server, da sie nicht dieselbe Laufzeit haben. Zweitens kann die Serialisierung nur mit einem Java-ish-Client funktionieren, wodurch iOS, Windows Phone, Symbian, Javascript (WebOS, AJAX/HTML5), Flash oder jede Nicht-Java-Desktop-Umgebung eliminiert wird. Intelligente Programmierer boxen sich in so wenigen Ecken wie möglich. – CommonsWare

0

ich den Vorschlag von XStream Sekunde. Es ist eine sehr nette und einfache API. Ich mag die Serialisierungsformate XML oder JSON jedoch nicht, weil sie textbasiert sind. Für ein kompakteres Serialisierungsformat versuchen Sie ProtoBuf von Google.

Verwandte Themen