5

ソケットを介してクラスを送信しようとしていますが、これはすべて正常に機能します。ただし、明らかな理由もなく、変数の 1 つが台無しになります。さらに説明しましょう。

私が使用しているコードは次のとおりです(GSonが作成されるクライアントソケットの場合):

while(!someQueueVariable.isEmpty()){
     QueryHolder h = this.someQueueVariable.poll();
     Gson g = new Gson();
     String send = g.toJson(h);
     out.println(send);
}

QueryHolder は、2 つStringsの とObject[].

Netbeans の組み込みデバッガーを試してみたところ、次の変数が存在 変数 していました。青色で強調表示されている変数は、確認する必要がある変数です。ご覧のとおり、最初に の値を持つ Timestamp オブジェクトがあり2013-02-18 15:49:36.415、それが に変わりましたFeb 18, 2013 3:49:36PM。ここで何か間違ったことをしていますか?それはGSonのバグですか?

4

2 に答える 2

14

Gson ユーザー ガイドでは、カスタム シリアライザー/デシリアライザーの作成について説明するときに、これについて言及しています。表示されているのは、ロケールの形式で出力/フォーマットするjava.sql.Timestampオブジェクト (のサブクラス)のデフォルトのシリアル化です。Date

GsonBuilder()の Javadoc を見るとsetDateFormat()、問題のために特別に作成されたメソッドが見つかります。カスタム シリアライザーは必要ありません。JSON で必要なパターンを指定するだけです。

public static void main(String[] args)
{
    Timestamp t = new Timestamp(System.currentTimeMillis());
    System.out.println(t);
    System.out.println(t.toLocaleString());
    String json = new Gson().toJson(t);
    System.out.println(json);
    json = new GsonBuilder()
               .setDateFormat("yyyy-MM-dd hh:mm:ss.S")
               .create()
               .toJson(t);

    System.out.println(json);
}    

出力 (現時点では明らかに):

2013-02-18 11:32:21.825
2013 年 2 月 18 日 11:32:21 午前
"2013 年 2 月 18 日 11:32:21 午前"
"2013-02-18 11:32:21.825"

于 2013-02-18T18:37:13.117 に答える
2

2013-02-18 15:49:36.415、2013 年 2 月 18 日 3:49:36PM になりました

これらはどのように異なるのですか?これは単にレンダリングの問題のように見え、タイムスタンプはSimpleDateFormatなどを介して文字列に変換されています。

于 2013-02-18T15:12:13.993 に答える