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静的フィールドを複数回解析および書き込みすることは期待できませんが、1回だけです。しかし、それを見逃すよりはましではないでしょうか。

4

2 に答える 2

18

ただし、誰かが静的を含めたい場合は、一時と静的の両方のデフォルトを一時だけにオーバーライドするため、一時を無視するようにビルダーを変更します。

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メソッドを使用してObjectOutputStreamに個々のフィールドを書き込むか、DataOutputでサポートされているプリミティブデータ型のメソッドを使用して保存されます。

参照

静的フィールド状態の場合、特定のオブジェクトに属するだけでなく、すべてのクラスに属します。

したがって、静的フィールドは特定のオブジェクトの状態になります。

于 2013-02-01T11:11:21.270 に答える