2016-03-01 45 views
5

Sto utilizzando Azure Mobile App SDK per Android.Invio di DateTimeOffset da Android a .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()); 

Esso viene utilizzato come segue:

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

All'inserimento, il ClientCreatedAt è impostato su zero, quando ho studiato l'istruzione di inserimento, è il GSON all'interno della libreria non serializzazione la datetimeoffset, in particolare, questa linea:

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

Quando si sostituisce la DateTimeOffset con Date, il valore è pr serializzato operly.

Quindi, le mie domande sono:

  1. E 'destinato a Azure Mobile Apps per me di utilizzare il DateTimeOffset e, se sì, qual è il modo giusto per usarlo?
  2. Posso forzare Gson a serializzare DateTimeOffset correttamente? Ho guardato le Annotazioni di Gson, ma nulla che possa esserci d'aiuto. Non sono sicuro di dover creare un getter e un setter per la serializzazione e la deserializzazione.

risposta

0

Se non è troppo tardi per la risposta. Ho lo stesso problema. È possibile utilizzare
Calendar c = Calendar.getInstance(); SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); String formattedDate = df.format(c.getTime()); per analizzare la data. IMHO sarebbe più facile da usare Gson e Volley. Penso che tu possa leggerlo come stringa e poi convertirlo in Data.

+0

Si tratta della classe di Azure SDK DateTimeOffset? – Adam

+0

Voglio dire usare la stringa in classe, ma inserire la data in questo tipo di formato. Qualcosa di simile a questo 'classe pubblica MyClass { ID stringa pubblico; public String ClientCreatedAt; } MyClass inst = new MyClass(); inst.ClientCreatedAt = df.Format (c.getTime); ' – Airat

+0

La mia domanda è diversa, grazie comunque :) – Adam

2

DateTimeOffset è in realtà un wrapper stupido di Date. Qui è nella sua interezza.

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

ho buttato le mani in aria e semplicemente ha deciso di utilizzare le stringhe, invece, e la classe DateTime di Joda-time tramite DateTime.parse(string) per gestirli.

Tuttavia, la buona alternativa è probabilmente registrare il proprio serializzatore tramite MobileServiceClient.registerSerializer(...) ma non si otterrà nulla di utile dall'utilizzo del proprio wrapper.

Questo SDK è spazzatura.

edit: Utilizzando un personalizzato (de) serialiser sembra funzionare abbastanza bene:

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

impostare fino a deserialise/serialise da/per l'oggetto della vostra scelta, quindi impostare un'istanza di via MobileServiceClient.registerSerializer + registerDeserializer . Se utilizzi la sincronizzazione locale, usa solo ColumnDataType.String o ColumnDataType.DateTimeOffset (è solo String sotto il cofano). Ora puoi impostare il tuo campo sul tipo che desideri.

private DateTime date;