为什么静态字段使用google.gson.GsonBuilder JSON解析器不序列化?(Why

2019-07-19 03:16发布

我尝试使用google.gson.GsonBuilder如下序列化的对象:

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);
   }
}

返回值 JsonTest类方法ToJson()是空的。 如果我改变staticField字段声明为非静态的 ,它按预期工作。 考虑为什么静态字段不能序列化,它应该被视为一个错误 ? 或者是它认为没有必要?

如果我有一个列表 JsonTest我不希望有静态字段解析,并写入多次 ,但一次 。 然而,是不是比缺少它在所有更好?

Answer 1:

Java序列只序列对象的非静态和非瞬态字段,因为,

该defaultReadObject方法使用流中的信息来分配与当前对象的相应命名的字段中保存的流中的物体的领域。 这种处理上课的时候已经发展到增加新场的情况下。 该方法不需要与状态属于其超类或子类关注自身。 状态是通过使用writeObject方法写入ObjectOutputStream中的各个字段或使用DataOutput支持的用于基本数据类型的方法保存。

参考

在静态字段状态的情况下,不仅属于它会属于所有类的任何特定对象。

因此,静态字段将配备在任何特定对象的状态。



Answer 2:

但如果有人想包括静态 ,改变建设者只是忽略短暂的,因为你将覆盖短暂的和静态的默认只是短暂的。

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);


文章来源: Why static fields not serialized using google.gson.GsonBuilder JSON parser?