2016-03-01 4 views
5

Ich verwende Azure Mobile Apps SDK für Android.Senden von DateTimeOffset von Android auf .NET Web API

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()); 

es verwendet wird, wie folgt:

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

Beim Einsetzen

wird die ClientCreatedAt auf null gesetzt, wenn I die INSERT-Anweisung untersucht, ist es der Gson innerhalb der Bibliothek, der nicht der ist serializing Datetime, speziell diese Linie:

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

Als ich die DateTimeOffset mit Date ersetzen, ist der Wert serialisierten pr Wirklich.

Also, meine Fragen sind:

  1. Ist es in Azure Mobile-Apps, die für mich die Datetime zu verwenden und wenn ja, was ist der richtige Weg, es zu benutzen?
  2. Kann ich Gson zwingen, das DateTimeOffset richtig zu serialisieren? Ich habe mir die Gson Annotations angesehen, aber nichts, was da helfen könnte. Ich bin mir nicht sicher, ob ich einen Getter und einen Setter für die Serialisierung und Deserialisierung schaffen sollte.

Antwort

0

Wenn es nicht zu spät ist für die Antwort. Ich habe dasselbe Problem. Sie können
Calendar c = Calendar.getInstance(); SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); String formattedDate = df.format(c.getTime()); verwenden, um das Datum zu analysieren. IMHO wäre einfacher, Gson und Volley zu verwenden. Ich denke, Sie können es als Zeichenfolge lesen und dann in Datum konvertieren.

+0

Ist dies in Bezug auf die DateTimeOffset Azure SDK-Klasse? – Adam

+0

Ich meine benutze Zeichenfolge in der Klasse, aber Datum in diesem Format eingeben. So etwas wie diese 'öffentliche Klasse MyClass { öffentliche String Id; öffentlicher String ClientCreatedAt; } MyClass inst = neu MyClass(); inst.ClientCreatedAt = df.Format (c.getTime); ' – Airat

+0

Meine Frage ist anders, danke trotzdem :) – Adam

2

ist eigentlich eine dumme wrapper Date. Hier ist es in seiner Gesamtheit.

/** 
* 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()); 
    } 
} 

Ich warf meine Hände in der Luft und beschlossen, einfach Strings zu verwenden, anstatt, und DateTime.parse(string) über Datetime-Klasse joda-Zeit, sie zu handhaben.

Die nette Alternative ist wahrscheinlich, Ihren eigenen Serialiser über MobileServiceClient.registerSerializer(...) zu registrieren, aber Sie werden nichts nützliches aus der Verwendung ihres Wrappers bekommen.

Dieses SDK ist Quatsch. deserialise/serialise zu/von dem Objekt Ihrer Wahl

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()); 
    } 
} 

Set it up, dann eine Instanz davon über MobileServiceClient.registerSerializer + registerDeserializer gesetzt:

bearbeiten: eine benutzerdefinierte Verwendung (de) Serializer scheint ganz gut zu funktionieren . Wenn Sie die lokale Synchronisation verwenden, verwenden Sie einfach ColumnDataType.String oder ColumnDataType.DateTimeOffset (es ist nur String unter der Haube). Jetzt können Sie Ihr Feld auf den gewünschten Typ einstellen lassen.

private DateTime date;