0

いくつかのDateTimeOffsetプロパティを含む一連のエンティティクラス(Linq to SQLによって生成される)があります。

これを.asmxWebサービスからJSONとしてネットワーク経由で送信すると、JSONシリアライザーは次のJSONを生成します。

{"DateTime":"\/Date(1252142834307)\/",
 "UtcDateTime":"\/Date(1252142834307)\/",
 "LocalDateTime":"\/Date(1252142834307)\/",
 "Date":"\/Date(1252101600000)\/",
 "Day":5,
 "DayOfWeek":6,
 "DayOfYear":248,
 "Hour":11,
 "Millisecond":307,
 "Minute":27,
 "Month":9,
 "Offset":{"Ticks":72000000000,
           "Days":0,
           "Hours":2,
           "Milliseconds":0,
           "Minutes":0,
           "Seconds":0,
           "TotalDays":0.083333333333333329,
           "TotalHours":2,
           "TotalMilliseconds":7200000,
           "TotalMinutes":120,
           "TotalSeconds":7200},
 "Second":14,
 "Ticks":633877468343070254,
 "UtcTicks":633877396343070254,
 "TimeOfDay":{"Ticks":412343070254,
              "Days":0,
              "Hours":11,
              "Milliseconds":307,
              "Minutes":27,
              "Seconds":14,
              "TotalDays":0.47724892390509255,
              "TotalHours":11.453974173722221,
              "TotalMilliseconds":41234307.025400005,
              "TotalMinutes":687.23845042333335,
              "TotalSeconds":41234.3070254},
 "Year":2009}
}

クライアントの帯域幅とJSON解析時間を節約したいと思います。また、Webサービスに送信する前に、すべてのDateTimeOffsetを手動で投影する必要がないようにしたいと思います。

JSONシリアライザーが想定どおりに動作することを理解しているので、私の質問は次のとおりです。DateTimeOffsetオブジェクトのLocalDateTimeプロパティを送信するようにJSONシリアライザーを構成する方法はありますか?

ありがとう、エギル。

4

1 に答える 1

2

オブジェクトのシリアル化出力を変更するには、DateTimeOffsetオブジェクトのシリアル化メソッドをオーバーライドする必要があります。DateTimeOffsetはBCLの一部であるため、これを自分で上書きすることはできません。

最も簡単な解決策は、DateTimeOffsetを実装するカスタムオブジェクトを作成し、ISerializableインターフェイスからGetObjectDataをオーバーライドできるようにすることです。WebメソッドはDateTimeOffsetオブジェクトではなくカスタムオブジェクトを返す必要がありますが、このWebサービスの使用がJSON形式である場合、これはクライアントベースに影響を与えないはずです。

システムで生成されたクラスにはちょっとした苦痛がありますが、シリアル化された出力を制御するには、独自のクラスに置き換える必要があります。

于 2009-09-08T02:38:12.233 に答える