使用HTTP客户端将序列化对象从Android发送到servlet

我试图创建一个android应用程序,将一个序列化对象从手机发送到servlet,对象的内容是用户输入,我将使用hibernate存储在数据库中。 我认为问题在于代码所在的对象的序列化和反序列化。 如果有人能提供帮助我会非常感激。

ps类User实现可序列化接口

客户

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

如建议的那样,使用XML或JSON。 您可以从此博客获取针对Android的XStream补丁,以便将对象序列化为XML。

不要在体系结构之间使用序列化。 使用JSON,XML或其他与架构无关的东西。

我是第二个XStream的建议。 这是一个非常好用且简单的API。 我不喜欢序列化格式XML或JSON,因为它们是基于文本的。 要获得更紧凑的序列化格式,请尝试使用 Google的ProtoBuf 。