2016-03-01 16 views
5

私はAndroid用のAzure Mobile Apps SDKを使用しています。次のようにそれが使用されているAndroidから.NET Web APIへのDateTimeOffsetの送信

public class MyClass { 
    public String Id; 
    public String Code; 
    public DateTimeOffset ClientCreatedAt; 
} 

MyClass myClass = new MyClass(); 
myClass.Id = "1234567890"; 
myClass.Code = "dfgdrvyet"; 
myClass.ClientCreatedAt = new DateTimeOffset(new Date()); 

:挿入すると

MobileServiceSyncTable<MyClass> myClassSyncTable = _client.getSyncTable(MyClass.class); 
ListenableFuture<MyClass> responseFuture = myClassSyncTable.insert(myClass); 

私はinsert文を調査したときに、ClientCreatedAtは、nullに設定され、それが直列化されていないライブラリ内GsonですDATETIMEOFFSET、具体的には、この行は:私はDateTimeOffsetDateと交換

JsonObject json = mClient.getGsonBuilder().create().toJsonTree(item).getAsJsonObject(); 

、値はシリアル化されたPRです動かす。

だから、私の質問は以下のとおりです。

  1. は私がのDateTimeOffsetを使用することがAzureのモバイルアプリに意図してそうならば、それを使用する正しい方法は何ですか?
  2. GsonにDateTimeOffsetを正しくシリアル化させることができますか?私はGson注釈を見ましたが、そこでは助けることはできません。私は、シリアライズとデシリアライズのためのゲッターとセッターを作成する必要があるかどうかはわかりません。

答えて

0

回答が遅くない場合は、私は同じ問題があります。
Calendar c = Calendar.getInstance(); SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); String formattedDate = df.format(c.getTime()); を使用すると、日付を解析できます。 IMHOはGsonとVolleyを使いやすくなります。私はあなたが文字列としてそれを読むことができると思うと日付に変換します。

+0

これは、DateTimeOffset Azure SDKクラスに関するものですか? – Adam

+0

私はクラス内で文字列を使用しますが、この形式の日付で日付を挿入することを意味します。このようなもの 'public class MyClass { public String Id; public String ClientCreatedAt; } MyClass inst = new MyClass(); inst.ClientCreatedAt = df.Format(c.getTime); ' – Airat

+0

私の質問は異なっています、とにかくありがとうございます:) – Adam

2

DateTimeOffsetは、実際にはDateのダムラッパーです。ここではそれが完全です。

/** 
* Represents a point in time, typically expressed as a date and time of day 
*/ 
public class DateTimeOffset extends Date { 

    public DateTimeOffset(Date date) { 
     this.setTime(date.getTime()); 
    } 
} 

私はそれらを処理するためにDateTime.parse(string)を経由して空気中に私の手を投げて、単に代わりに文字列を使用することを決めた、とジョダ時のDateTimeクラス。

しかし、素晴らしい代替手段はおそらくMobileServiceClient.registerSerializer(...)経由で独自のシリアライザを登録することですが、ラッパーを使用すると便利なものは得られません。

このSDKはごみです。

編集:カスタム(デ)シリアライザを使用すると、非常にうまく動作するようです:

private class DateTimeSerialiser implements JsonSerializer<DateTime>, JsonDeserializer<DateTime> { 
    @Override 
    public JsonElement serialize(final DateTime src, final Type typeOfSrc, final JsonSerializationContext context) { 
     return new JsonPrimitive(src.toString()); 
    } 

    @Override 
    public DateTime deserialize(final JsonElement json, final Type typeOfT, final JsonDeserializationContext context) throws JsonParseException { 
     return DateTime.parse(json.getAsString()); 
    } 
} 

が設定それをにシリアライズ/あなたの選択の対象から/ deserialiseする、そしてMobileServiceClient.registerSerializer + registerDeserializerを経由して、そのインスタンスを設定します。ローカル同期を使用している場合は、ColumnDataType.StringまたはColumnDataType.DateTimeOffset(これは単にフードの下の文字列です)を使用してください。これで、あなたのフィールドをあなたが望むタイプに設定できるようになりました。

private DateTime date; 
関連する問題