2016-02-23 2 views
0

Я пытаюсь десериализовать json api, который отправляет timestamps как длинные типы. Моя покрышка выглядит следующим образом:GWT Длинный тип API для анализа даты?

public class OverlayTest extends JavaScriptObject { 
    public final native Long getTimestamp() /*-{ return this.timestamp; }-*/; 
} 

, который, кажется, работает - когда я использую сорбент для печати на консоли, я получаю длинное значение ок. Я пытаюсь передать, что в экземпляр Date теперь для форматирования:

OverlayTest item = ...; 
Date date = new Date(item.getTimestamp()); 
// or 
Date date = new Date(item.getTimestamp().longValue()); 

, но я получаю исключение TypeError как:

longValue__J is not a function 

выход StackTrace немного искажаются, так как выход GWT уже скомпилирован в javascript в моем случае. Я знаю, что GWT каким-то образом подражает Long support, поскольку javascript не может сделать это напрямую - есть ли какое-то обходное решение для этого, или это будет невозможно?

Благодаря

ответ

2

Тип java.lang.Long (или long) эмулируется в GWT, так как JS не может правильно обрабатывать этот тип - все номера в JS эффективно Java удваивается, только около 54 бит точности, в то время как long/Long требует 64 бит. Если GWT позволяет передавать номера в JS как и длинные, вы потеряете точность.

В вашем коде GWT объект, состоящий из трех чисел, используется для правильного представления длин. Любой JS-код, который ожидает увидеть число, будет очень удивлен, увидев этот объект, и Java-код будет удивлен, увидев число вместо этого объекта-обертки.

Так что, либо перейдите double s и int s в и из JSNI. В этом случае передачи миллисов для даты, int будет работать нормально до 2038 или около того. Может быть, к тому времени у нас будут разумные номера в наших браузерах.

Даже если у вас было очень длинное число в вашем JS-коде, оно было бы тихо усечено так, чтобы оно соответствовало тому, что JS могло правильно представлять, поэтому вы ничего не теряете. Было бы лучше, если бы вы могли хранить данные в long все время, но если число проходит через JS (кроме как String), точность будет потеряна, это число достаточно велико. Но, конечно, если ваши номера не будут такими большими, вам будет достаточно double или int.

(Я не знаю, почему он работает правильно - предположим, что эмулируемый объект имеет приятный toString, но без специфики того, как вы его доработали, я не могу быть уверен, что произошло.)

+0

Хорошо спасибо, я вижу - поэтому самый правильный вариант - сделать что-то вроде передачи вниз по метке в строчном формате, таком как ISO 8601? – user3203425

+0

Да, или не идите дальше в будущее, чем 2038, или пропустите длинное число как String и используйте Long.parseLong, чтобы получить его. –