2016-01-21 92 views
0

我已經從服務器請求了一個二進制文件,並且我想將此文件中的數據反序列化爲類對象。以下是我的代碼。有人可以告訴我是否有更優雅和便捷的方法來做到這一點,因爲我有幾個不同的類對象。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}'); 
     } 
    } 
+0

我不知道這個問題是關於什麼。你如何序列化服務器端的類?二進制數據如何編碼? –

+0

感謝您的回覆。不是類,而是類對象包含的數據結構。二進制文件從另一個軟件轉儲。在一些面向對象的語言中,像c/C++,c#,java等,有一些方法可以讀取/反序列化數據結構。但是我沒有在JavaScript和Dart中找到方法。 – bopomofo

+0

看到我的答案。如果您提供更多信息,您可以在項目中找到可能性,我可以詳細闡述可能的方法。 –

回答

1

二進制是從另一個軟件傾倒。在一些面向對象的語言中,像c/C++,c#,java等,有一些方法可以讀取/反序列化數據結構。但我沒有找到在JavaScript和飛鏢的方式

這聽起來像一個語言特定的編碼。通常沒有其他語言的庫可用於反序列化,因爲源語言可能使用目標語言中不可用的特徵/構造,或者無法映射1:1。

如果你可以使用一個平臺中立的方式在第一時間序列化有幾個選項

  • JSON用於此很多,因爲它是與語言無關,但也比較有限。

  • 還有其他的跨平臺解決方案,如谷歌協議緩衝區和許多支持大量編程語言的其他跨平臺解決方案。

你當然可以解碼Dart中的二進制數據,但你需要知道如何自己解釋二進制數據,並相應地讀取和解釋它。

+0

謝謝。我明白你的觀點,並且正在考慮使用谷歌協議緩衝區。 – bopomofo