我使用 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
字段声明更改为非静态,则按预期工作。考虑为什么静态字段没有被序列化,是否应该将其视为 bug ?或者它被认为是不必要的?
如果我有一个列表 JsonTest
我不希望解析和编写多次静态字段但一次 。但是,这不是比错过它更好吗?
答案 0 :(得分:14)
但是如果有人想要包含静态,请将构建器更改为忽略瞬态,因为您将覆盖瞬态和静态的默认值,只是瞬态。
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);
答案 1 :(得分:7)
Java Serialization仅序列化对象的非静态和非瞬态字段,因为,
defaultReadObject方法使用流中的信息进行分配 保存在流中的对象的字段与之相对应 当前对象中的命名字段。这处理的情况 class已经发展到添加新字段。该方法不需要 关注属于其超类或国家的国家 子类。通过将单个字段写入到状态来保存状态 ObjectOutputStream使用writeObject方法或使用 DataOutput支持的原始数据类型的方法。
如果静态字段状态不仅属于任何特定对象,它将属于所有类。
因此静态字段将处于任何特定对象的状态。