2010-01-05 23 views
5

我試圖創建一個android應用程序,從電話發送序列化的對象到一個servlet對象的內容是來自用戶的輸入,我將存儲在一個使用休眠的數據庫。我相信問題在於代碼所在的對象的序列化和反序列化。如果有人能幫助我,我會非常感激。從Android發送一個序列化的對象到一個使用HTTP客戶端的servlet

P.S類用戶實現Serializable接口

客戶

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

     } 

} 




} 

回答

3

建議使用XML或JSON。 爲了將對象序列化爲XML,您可以獲得針對Android from this blogXStream修補程序。

1

不要架構之間使用序列化。使用JSON,XML或其他與架構無關的其他內容。

+0

爲什麼它需要在架構中立,如果OP是在控制servlet? – Rick 2011-05-14 06:22:52

+2

@Rick:servlet不是問題。客戶是問題。目前,OP正在嚴格考慮Android。首先,不能保證Android的序列化格式與服務器的相同,因爲它們不運行相同的運行時。其次,序列化只能用於Java-ish客戶端,無需iOS,Windows Phone,Symbian,Javascript(WebOS,AJAX/HTML5),Flash或任何非Java桌面環境。聰明的程序員儘可能地將自己裝在儘可能少的角落裏。 – CommonsWare 2011-05-14 10:49:46

0

我第二次提出了XStream的建議。這是一個非常好的和簡單的API。我不喜歡序列化格式XML或JSON,因爲它們是基於文本的。要獲得更緊湊的序列化格式,請嘗試Google提供的ProtoBuf

相關問題