2010-01-05 5 views
5

Próbowałem utworzyć aplikację androidową, która przesyła obiekt zeskanowany z telefonu do serwletu, a zawartość obiektu to dane wejściowe od użytkownika, które będę przechowywać w baza danych za pomocą hibernacji. Wierzę, że problem polega na serializacji i deserializacji obiektu, który znajduje się poniżej kodu. Jeśli ktokolwiek mógłby mi pomóc, byłbym bardzo wdzięczny.Wysyłanie serializowanego obiektu z systemu Android do serwletu przy użyciu klienta HTTP

p.s klasa User implementuje Serializable interfejs

klienta

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

     } 

} 




} 

Odpowiedz

3

Zgodnie z sugestią, użyj XML lub JSON. Możesz pobrać łatkę XStream dla Androida from this blog w celu serializowania obiektów do formatu XML.

1

Nie używać serializacji między architektur. Użyj JSON, XML lub czegoś innego, co jest neutralne dla architektury.

+0

dlaczego musi być neutralna pod względem architektury, jeśli OP kontroluje serwlet? – Rick

+2

@Rick: Serwlet nie jest problemem. Problemem są klienci. Obecnie OP ściśle myśli o Androidzie. Po pierwsze, nie ma gwarancji, że format serializacji dla Androida jest taki sam jak dla serwera, ponieważ nie działają one w tym samym środowisku wykonawczym. Po drugie, serializacja może działać tylko z klientem Java, eliminując iOS, Windows Phone, Symbian, JavaScript (WebOS, AJAX/HTML5), Flash lub inne środowisko graficzne inne niż Java. Inteligentni programiści pakują się w tak małe zakątki, jak to możliwe. – CommonsWare

0

Po drugie proponuję XStream. To bardzo ładne i łatwe API. Nie podoba mi się format XML lub JSON w formacie szeregowania, ponieważ są oparte na tekście. Aby uzyskać bardziej kompaktowy format serializacji, spróbuj ProtoBuf od Google.

Powiązane problemy