2015-02-08 4 views
4

Я хочу отправить 2 объекта на сервер Java с Android-клиента, используя сокет (поскольку я разрабатываю удаленный ПК).Как использовать Gson для сериализации объектов в android?

AndroidClient.java

public class MainActivity extends Activity{ 
     Socket client; 
     ObjectOutputStream oos; 
     OutputStream os; 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_main); 
        SendObj so=new SendObj(); 
        so.execute(); 
     } 

     class SendObj extends AsyncTask<Void, Void, Void>{ 
      @Override 
      protected Void doInBackground(Void... arg0) { 
        try { 
         client=new Socket("192.168.237.1",6566); 
         os=client.getOutputStream(); 
         oos=new ObjectOutputStream(os); 
         Serializer ma=new Serializer(2, "Helllo"); 
         Log.i("Serial",""+ma.name); 
         oos.writeObject(ma); 
         oos.writeObject(new String("Another Object from Client")); 
         oos.close(); 
         os.close(); 
         client.close(); 
        } catch (UnknownHostException e) { 
         e.printStackTrace(); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
        return null; 
      } 
     } 

     @Override 
     public boolean onCreateOptionsMenu(Menu menu) { 
      // Inflate the menu; this adds items to the action bar if it is present. 
      getMenuInflater().inflate(R.menu.main, menu); 
      return true; 
     } 

    } 

    @SuppressWarnings("serial") 
    class Serializer implements Serializable { 
     int num; 
     String name; 
     public Serializer(int num,String name){ 
      this.name=name; 
      this.num=num; 
     } 
    } 

JavaServer.java

public class ObjectReceiver { 
     static ServerSocket server; 
     static Socket client; 
     static ObjectInputStream ois; 
     static InputStream is; 

     public static void main(String[] arg) throws IOException, ClassNotFoundException{ 
      server=new ServerSocket(6566); 
      System.out.println("Wait"); 
      while(true){ 
       client=server.accept(); 
       System.out.println("Connected"); 
       is=client.getInputStream(); 
       ois=new ObjectInputStream(is); 
       try { 
        ObjectSerail or = (ObjectSerail) ois.readObject(); 
        if(or!=null){ 
         System.out.println("Done"); 
        } 
       } catch (ClassNotFoundException e) { 
        e.printStackTrace(); 
       } 

      } 
     } 

     @SuppressWarnings("serial") 
     class ObjectSerail implements Serializable{ 
      int num; 
      String name; 
      public ObjectSerail(int num,String name){ 
       this.name=name; 
       this.num=num; 
      } 
     } 
    } 

Конечно, я знаю, что выше метод не будет работать, потому что он будет дает ClassNotFoundException(). Итак, теперь я хочу знать, как я могу использовать библиотеку Gson для сериализации и десериализации объектов. Заранее спасибо.

ответ

11

gson может использоваться с Java на любой платформе - не только для Android.

Использование gson для сериализации одного объекта:

// Serialize a single object.  
    public String serializeToJson(MyClass myClass) { 
     Gson gson = new Gson(); 
     String j = gson.toJson(myClass); 
     return j; 
    } 

Использование gson для десериализации к одному объекту.

// Deserialize to single object. 
    public MyClass deserializeFromJson(String jsonString) { 
     Gson gson = new Gson(); 
     MyClass myClass = gson.fromJson(jsonString, MyClass.class); 
     return myClass; 
    } 

Как видно из приведенных примеров, gson вполне волшебно :) Это на самом деле не волшебно - вам нужно обеспечить хотя бы пару вещей:

Убедитесь, что ваш класс имеет в себе никаких арг конструктор, чтобы библиотека gson могла легко получить экземпляр.

Убедитесь, что имена атрибутов совпадают с именами в json, чтобы библиотека gson могла отображать поля из json в поля вашего класса.

См. Также https://sites.google.com/site/gson/gson-user-guide#TOC-Object-Examples