http 클라이언트를 사용하여 Android에서 Servlet으로 직렬화 된 객체를 보내기

StackOverflow https://stackoverflow.com/questions/2009707

문제

휴대 전화에서 세련된 객체를 서블릿으로 보내는 Android 애플리케이션을 만들려고 노력했습니다. 객체의 내용은 Hibernate를 사용하여 데이터베이스에 저장할 사용자의 입력입니다. 나는 문제가 코드가 아래에있는 객체의 직렬화 및 사제화와 관련이 있다고 생각합니다. 누군가가 도울 수 있다면 나는 매우 크게 할 것입니다.

PS 클래스 사용자는 직렬화 가능한 인터페이스를 구현합니다

고객

    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을 사용하십시오. 당신은 얻을 수 있습니다 xstream 안드로이드를 위해 패치 이 블로그에서 객체를 XML로 직렬화하려면.

다른 팁

아키텍처간에 직렬화를 사용하지 마십시오. JSON, XML 또는 아키텍처 중립적 인 것을 사용하십시오.

두 번째 Xstream의 제안. 아주 멋지고 쉬운 API입니다. 직렬화 형식 XML 또는 JSON은 텍스트 기반이기 때문에 마음에 들지 않습니다. 보다 컴팩트 한 직렬화 형식의 경우 시도하십시오 protobuf Google에서.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top