Why static fields not serialized using google.gson

2020-03-03 06:01发布

I tried serializing an object using google.gson.GsonBuilder as follows:

public class JsonHelper
{
    public static String ToJson(Object o, Type oType)
    {
        Gson gson = new().setPrettyPrinting().setDateFormat("yyyy-MM-dd'T'HH:mm:ss").create();
        gson.toJson(o, oType);
    }
}

public class JsonTest
{
   public static String staticField;

   public static String ToJson()
   {
       JsonTest newJsonTest = new JsonTest();
       newJsonTest.staticField = TelephoneStatus.GetPhoneIMEI(); // let's say we use static field to keep IMEI

       Type oType = new TypeToken<JsonTest>(){}.getType();
       return JsonHelper.ToJson(newJsonTest, oType);
   }
}

Return value for JsonTest class method ToJson() is empty. If i change staticField field declaration to be non-static, it works as expected. Considering why static fields are not serialized, should it be considered as a bug? Or is it considered unnecessary?

If i had a list of JsonTest i wouldn't expect having static field parsed and written multiple times but once. However, isn't it better than missing it at all?

2条回答
闹够了就滚
2楼-- · 2020-03-03 06:32

Java Serialization only serialize object's non-static and non-transient fields because,

The defaultReadObject method uses information in the stream to assign the fields of the object saved in the stream with the correspondingly named fields in the current object. This handles the case when the class has evolved to add new fields. The method does not need to concern itself with the state belonging to its superclasses or subclasses. State is saved by writing the individual fields to the ObjectOutputStream using the writeObject method or by using the methods for primitive data types supported by DataOutput.

Reference

In case of static field state not only belongs to any specific object it will belongs to all class.

So the static field would be comes under state of any specific object.

查看更多
孤傲高冷的网名
3楼-- · 2020-03-03 06:44

but if someone wants to include static, change the builder to just ignore transient, since you will override the the default of both transient and static to just transient.

GsonBuilder gsonBuilder  = new GsonBuilder();
// Allowing the serialization of static fields    

gsonBuilder.excludeFieldsWithModifiers(java.lang.reflect.Modifier.TRANSIENT);
    // Creates a Gson instance based on the current configuration
    Gson gson = gsonBuilder.create();
    String json = gson.toJson(objectToSerialize);
    System.out.println(json);
查看更多
登录 后发表回答