我试图创建一个Android应用程序,它将序列化对象从手机发送到servlet,对象的内容是用户的输入,我将使用hibernate将其存储在数据库中。我认为问题在于代码所在的对象的序列化和反序列化。如果有人能提供帮助我会非常感激。
p.s类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();
}
}
}
答案 0 :(得分:4)
根据建议,使用XML或JSON。 您可以为Android XStream修补from this blog,以便将对象序列化为XML。
答案 1 :(得分:1)
不要在体系结构之间使用序列化。使用JSON,XML或其他与架构无关的东西。
答案 2 :(得分:0)
我是第二个XStream的建议。这是一个非常好用且简单的API。我不喜欢序列化格式XML或JSON,因为它们是基于文本的。要获得更紧凑的序列化格式,请尝试使用Google提供的ProtoBuf。