如何使用Gson序列化android中的对象?

Posted

技术标签:

【中文标题】如何使用Gson序列化android中的对象?【英文标题】:How to use Gson to serialize objects in android? 【发布时间】:2015-04-08 03:25:16 【问题描述】:

我想使用套接字从 android 客户端向 Java 服务器发送 2 个对象(因为我正在开发远程 PC)。

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 库来序列化和反序列化对象。提前致谢。

【问题讨论】:

【参考方案1】:

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

【讨论】:

以上是关于如何使用Gson序列化android中的对象?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用GSON反序列化不同对象的数组

完全理解Gson:Gson反序列化

Android 中使用Gson完成对象的序列化与反序列化

Android 中使用Gson完成对象的序列化与反序列化

如何使用Gson反序列化Kotlin数组列表?

Android Gson 使用详解