7

我尝试使用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我不会期望静态字段被多次解析和写入,而是一次。然而,这不比完全错过更好吗?

4

2 回答 2

18

但是如果有人想包含 static,请将构建器更改为忽略瞬态,因为您会将瞬态和静态的默认值覆盖为仅瞬态。

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);
于 2015-11-12T07:23:38.277 回答
12

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

defaultReadObject 方法使用流中的信息将保存在流中的对象的字段分配给当前对象中相应命名的字段。这可以处理类已经演变为添加新字段的情况。该方法不需要关注属于其超类或子类的状态。通过使用 writeObject 方法或使用 DataOutput 支持的原始数据类型的方法将各个字段写入 ObjectOutputStream 来保存状态。

参考

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

因此,静态字段将处于任何特定对象的状态。

于 2013-02-01T11:11:21.270 回答