8

Webサービスを介していくつかのオブジェクトを渡しているところ、それらのいくつかにはjava.sql.Dateが含まれています。Dateには空のコンストラクターがないため、シリアル化する必要はありません。

質問の最初の部分は簡単です:クライアントとサービスの間で日付を渡すための最良の方法は何ですか?

2番目の部分は少し注意が必要です。日付を渡す方法を決定したら、明らかに日付を一時的に宣言し、日付を文字列などとして渡すラッパークラスを作成できますが、同じソリューションを、Dateを含むいくつかのクラスに可能な限り透過的に適用する方法?

(DynamicProxyが解決策になるかもしれないという予感がありますが、Sunのサイトのドキュメントを読むことはあまり役に立ちませんでした。したがって、それが本当にその方向にあるものである場合は、いくつかの説明をいただければ幸いです)

編集:私は間違った質問をしました、申し訳ありません(私と同僚の間で実際に何が問題であるかについての誤解があります)。デシリアライズが原因で問題が発生します。したがって、xml形式の日付を取得すると、GregorianCalendarとして自分自身を逆シリアル化しようとします。質問の他の部分はまだ残っています:10の異なるクラスに対して10の異なるラッパーを作成せずに、何か(長いタイムスタンプまたはGregorianCalendar)を受け取り、それをsqldateに変換する最良の方法は何ですか。コードとwsdlの生成にNetBeansを使用しています。

4

12 に答える 12

9

Joda-Time

Date クラスには扱いにくい API があります。より良い実装はJoda-Timeです。

ISO8601

Joda-Time では、日付をISO 8601標準形式 (yyyy-mm-ddTHH:MM:SS.SSS)に変換することもできます。サーバーからクライアントに日付を移動するときにこの標準を使用すると、完全な日付を読み取り可能な形式で含めることができるという利点があります。たとえばJAXBを使用する場合、日付の XML 表現もこの ISO 標準です。(XMLGregorianCalendar クラスを参照)

于 2008-09-22T12:52:54.423 に答える
6

前に提案したように、Date.getTime() によって返された long をシリアル化すると機能します。ただし、サーバーがクライアントとは別のタイム ゾーンにある場合は、反対側で再構築する日付が異なることに注意してください。まったく同じ日付オブジェクトを再構築したい場合は、タイムゾーン (TimeZone.getID()) も送信し、それを使用して反対側の日付を再構築する必要があります。

于 2008-09-22T12:45:34.193 に答える
3

質問の最初の部分に答えるには、iso 8601 形式の文字列をお勧めします (これは日付をエンコードするための標準です)。

2 番目の部分については、プロキシ クラスが必要な理由がわかりません。または、これをサポートするために日付クラスを拡張する必要がある理由。例えば。あなたの Web サービスは、特定のフィールドが日付であることを認識し、日付から文字列への変換を行ったり、元に戻すことはできませんか? もう少し情報が必要です。

于 2008-09-22T13:08:19.240 に答える
2

java.sql.Dateはjava.util.Dateを拡張します

getTime()を使用して、そこから長い値を取得するだけです。これをシリアル化して、もう一方の端で新しいjava.sql.Date(long)または新しいjava.util.Date(long)を構築できます。

于 2008-09-22T12:34:35.123 に答える
1
于 2015-01-20T03:52:58.657 に答える
1

私はjava.sql.Dateの実装を調べましたが、java.sql.Dateはjava.util.Dateの拡張としてシリアライズ可能です。

于 2008-09-22T12:47:06.263 に答える
1

最近気になった java.sql.Date の注意点の 1 つは、時刻部分 (時間、分、秒など) は日付部分だけを格納することです。完全なタイムスタンプが必要な場合は、java.util.Date または java.sql.Timestamp を使用する必要があります

于 2008-09-22T18:26:50.720 に答える
0

java.sql.DateはすでにSerializableを実装しているので、実装する必要はありません:-)

あなたの主な質問に関する限り、私はほとんどすべてのXMLをオブジェクトに変換できるので、JAXBが大好きです。それを調べる価値があるかもしれません。

于 2008-09-22T13:43:10.153 に答える
0

まず、Web サービスを使用している場合は、通常の Java シリアライズではなく、XML にシリアライズしていることを意味します (ただし、マーシャリングおよびアンマーシャリング用の他のライブラリ)。したがって、質問にはいくつかの情報が欠けています。

次に、InputStream と OutputStream を制御できる場合は、ObjectOutputStream と ObjectInputStream を拡張して、replaceObject()resolveObject( ) をオーバーライドしてから、java.sql.Date のシリアル化を実装できます。

于 2008-09-22T12:36:26.057 に答える
0

日付 (java.sql.Date または java.util.Date) をシリアライズ/デシリアライズするために、デフォルトのコンストラクター (空) は必要ありません。逆シリアル化中にコンストラクターは呼び出されませんが、オブジェクトの属性はシリアル化されたデータの値に直接設定され、逆シリアル化されているため、オブジェクトをそのまま使用できます。

于 2008-09-22T12:43:40.843 に答える
0

エンコーダーとデコードを使用して、オブジェクトをシリアル化および逆シリアル化できます。

SWT Rectangle クラスをシリアル化する例を次に示します。

XMLEncoder encoder = new XMLEncoder(new FileOutputStream(file));
encoder.setPersistenceDelegate(
    Rectangle.class, 
    new DefaultPersistenceDelegate(new String[]{"x", "y", "width", "height"}));
encoder.writeObject(groups);
encoder.close();
于 2008-09-22T12:45:53.693 に答える
0

うーん...シリアル化されたオブジェクトインスタンス(デフォルトのJavaメカニズムを介してシリアル化された)が別のクラスのインスタンスとして逆シリアル化する必要がある理由は考えられません。クラス情報はシリアル化されたデータの固有の部分である必要があります。

したがって、それはあなたの(逆)シリアライゼーションフレームワークの問題であるか、フレームワークが「送信側」で「日付のような」オブジェクトを受け入れます(Calendar、java.util.Dateなど-したがって、java.sql.Dateもjava.util.Date を拡張し、一般的な日付形式の文字列に「シリアル化」し (そのため型情報が失われます)、受信側の Calendar オブジェクトに「逆シリアル化」します。

したがって、java.sql.Date に到達する最も簡単な方法は、

java.sql.Date date = new java.sql.Date(calendar.getTimeInMillis);

java.sql.Date が必要ですが、「デシリアライゼーション」から GregorianCalendar を取得します。

于 2008-09-22T14:22:24.350 に答える