dart: Как прочитать/десериализовать буфер данных из HttpRequest.response в объекты класса

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

    import 'dart:html';
    import 'dart:typed_data';

    class Header {
      final ByteData magic = new ByteData(3);
      int version;
      int minorVersion;
    ...// Other data members.
    }


    void main() {
      var path = 'url to a binary file';
      var request = new HttpRequest();
      request
        ..open('GET', path)
        ..responseType = 'arraybuffer'
        ..onLoadEnd.listen((e) => requestComplete(request))
        ..send();
    }

    void requestComplete(HttpRequest request) {
      if (request.status == 200) {
        print('headers: ${request.responseHeaders}');
        print('type: ${request.responseType}');

        ByteBuffer byteBuffer = request.response;

        var magic = byteBuffer.asUint8List(0, 3);
        print(new String.fromCharCodes(magic));

        var data = byteBuffer.asInt32List(4, 8);
        print(data);

...// Process other data
      } else {
        print('Request failed, status = ${request.status}');
      }
    }

person bopomofo    schedule 21.01.2016    source источник
comment
Я не уверен, о чем этот вопрос. Как вы сериализуете классы на стороне сервера? Как кодируются двоичные данные?   -  person Günter Zöchbauer    schedule 21.01.2016
comment
Благодарю за ваш ответ. Не классы, а структуры данных, содержащиеся в объектах класса. Бинарник сброшен из другого софта. В некоторых объектно-ориентированных языках, таких как c/c++, c#, java и т. д., есть несколько видов методов для чтения/десериализации структур данных. Но я пока не нашел способа в javascript и dart.   -  person bopomofo    schedule 21.01.2016
comment
Смотрите мой ответ. Если вы предоставите больше информации о том, какие возможности у вас есть в вашем проекте, я могу подробнее остановиться на возможных методах.   -  person Günter Zöchbauer    schedule 21.01.2016


Ответы (1)


Бинарник сброшен из другого софта. В некоторых объектно-ориентированных языках, таких как c/c++, c#, java и т. д., есть несколько видов методов для чтения/десериализации структур данных. Но я пока не нашел способа в javascript и dart

Это похоже на специфичную для языка кодировку. Обычно для других языков нет доступных библиотек для десериализации, потому что исходный язык, вероятно, использует функции/конструкции, которые недоступны в целевом языке или не могут быть сопоставлены 1:1.

Если вы можете использовать независимый от платформы способ сериализации, в первую очередь, есть несколько вариантов.

  • Для этого часто используется JSON, потому что он не зависит от языка, но также несколько ограничен.

  • Существуют и другие кросс-платформенные решения, такие как буферы протоколов Google и многие другие, поддерживающие множество языков программирования.

Вы, конечно, можете декодировать двоичные данные в Dart, но вам нужно знать, как интерпретировать двоичные данные самостоятельно, а также читать и интерпретировать их соответствующим образом.

person Günter Zöchbauer    schedule 21.01.2016
comment
Спасибо. Я понимаю ваши очки и рассматриваю возможность использования буферов протокола Google. - person bopomofo; 21.01.2016