2016-03-01 21 views
5

Tôi đang sử dụng Azure Mobile Apps SDK cho Android.Gửi DateTimeOffset từ Android tới .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()); 

Nó đang được sử dụng như sau:

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

Sau khi chèn, các ClientCreatedAt được thiết lập để null, khi tôi điều tra các báo cáo chèn, nó là Gson trong thư viện mà không được serialising sự DateTimeOffset, cụ thể, dòng này:

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

Khi tôi thay thế DateTimeOffset với Date, giá trị là serialized pr operly.

Vì vậy, câu hỏi của tôi là:

  1. Có dự định trong Azure Mobile Apps cho tôi để sử dụng DateTimeOffset và nếu như vậy, đúng cách để sử dụng nó là gì?
  2. Tôi có thể buộc Gson nối tiếp DateTimeOffset đúng cách không? Tôi nhìn vào chú thích Gson, nhưng không có gì có thể giúp đỡ ở đó. Tôi không chắc chắn nếu tôi nên tạo ra một getter và một setter cho serialising và deserialising.

Trả lời

0

Nếu không đến trễ để trả lời. Tôi có cùng một vấn đề. Bạn có thể sử dụng
Calendar c = Calendar.getInstance(); SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); String formattedDate = df.format(c.getTime()); để phân tích ngày. IMHO sẽ dễ sử dụng hơn Gson và Volley. Tôi nghĩ bạn có thể đọc nó dưới dạng chuỗi và sau đó chuyển đổi thành Ngày.

+0

Điều này có liên quan đến lớp DateTimeOffset Azure SDK không? – Adam

+0

Tôi muốn sử dụng chuỗi trong lớp, nhưng chèn ngày theo loại định dạng này. Một cái gì đó như thế này 'lớp công khai MyClass { Id chuỗi công khai; chuỗi công khai ClientCreatedAt; } MyClass inst = new MyClass(); inst.ClientCreatedAt = df.Format (c.getTime); ' – Airat

+0

Câu hỏi của tôi là khác nhau, cảm ơn bạn anyway :) – Adam

2

DateTimeOffset thực sự là một trình bao bọc câm của Date. Ở đây nó là toàn bộ.

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

Tôi đã ném tay lên trong không khí và chỉ đơn giản là quyết định sử dụng Strings thay vào đó, và lớp DateTime Joda thời gian của qua DateTime.parse(string) để xử lý chúng.

Tuy nhiên, lựa chọn tốt đẹp có lẽ là đăng ký serialiser của riêng bạn qua MobileServiceClient.registerSerializer(...) nhưng bạn sẽ không nhận được bất kỳ điều gì hữu ích khi sử dụng trình bao bọc của họ.

SDK này là rác.

chỉnh sửa: Sử dụng một tùy chỉnh (de) serialiser dường như làm việc khá tốt:

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 nó lên đến deserialise/tự các từ/đến các đối tượng của sự lựa chọn của bạn, sau đó thiết lập một thể hiện của nó qua MobileServiceClient.registerSerializer + registerDeserializer . Nếu sử dụng đồng bộ hóa cục bộ, chỉ cần sử dụng ColumnDataType.String hoặc ColumnDataType.DateTimeOffset (chỉ là Chuỗi dưới mui xe). Bây giờ bạn có thể đặt trường của bạn thành loại bạn muốn.

private DateTime date; 
Các vấn đề liên quan