SORU
15 HAZİRAN 2011, ÇARŞAMBA


Ölçülebilir Varlık Serileştirme: vs MessagePack (vs JSON)BSON

Son zamanlarda buldumMessagePackbir alternatifikiliGoogle için seri hale getirme biçimi Protocol Buffers ... ... ve aynı zamanda hem daha iyi performans JSON.

Ayrıca veri depolama için MongoDB tarafından kullanılan BSON seri hale getirme biçimi var.

Biri biraz daha detaylı bilgi verebilirfarklılıklar ve dis-/avantajları BSON olan vs MessagePack?


Sadece ölçülebilir ikili seri hale getirme biçimlerinin tam listesi için: ayrıca Gobs vardırGoogle Protokol Tamponlar halefi olacak olan. Ancakdiğer bahsedilen formatları aksine bu dil-agnostik ve Go's built-in reflection itimat edilmezayrıca, en az bir başka dil için kütüphaneler Dolusu var.

CEVAP
15 HAZİRAN 2011, ÇARŞAMBA


// MessagePack yazarı olduğumu unutmayın lütfen. Bu cevap önyargılı olabilir.

Biçim tasarım

  1. JSON ile uyumluluk

    Onun adı rağmen, JSON ile BSON uyumluluk MessagePack göre o kadar iyi değil.

    BSON gibi özel türleri vardır"", "", "" veya "" (bu tür MongoDB gerekli bence). MD5 UUID Min anahtar Objectıd Bu tür JSON ile uyumlu değildir. Tür bilgileri BSON nesneleri JSON dönüştürmek kaybolur bazı anlamına geliyor. Tek hizmet hem JSON ve BSON kullanmak için dezavantaj olabilir.

    MessagePack şeffaf/JSON dönüştürmek için tasarlanmıştır.

  2. MessagePack BSON daha küçüktür

    MessagePack biçimi BSON daha az ayrıntılı. Sonuç olarak, MessagePack nesneleri BSON daha küçük hale gelebilir.

    Örneğin, basit bir harita {"": 1, "b":2} BSON 19 bayt kullanır iken MessagePack ile 7 bayt seri.

  3. BSON-güncelleme destekler

    BSON, yeniden seri nesne tüm kayıtlı nesnenin bir parçası değiştirebilirsiniz. Hadi göster varsayalım {"": 1, "b":2} "" 1-2000. değerini güncellemek istediğiniz bir dosyada saklanır ve bir

    , 1 MessagePack ile sadece 1 byte kullanır ama 2000 3 bayt kullanır. "B" geri 2 bayt tarafından taşınması gerekir iken "b" değil değiştirilir.

    BSON, 1 ve 2000 de 5 bayt kullanın. Bu ayrıntı yüzünden, taşımak zorunda değilsin "b".

  4. MessagePack RPC vardır

    MessagePack, Protokol Tamponlar, Tasarruf ve Avro destek RPC. Ama BSON yok.

Bu farklılıklar MessagePack aslında BSON depolar için tasarlanmış olsa da, ağ iletişimi için tasarlanmış olduğu anlamına gelmez.

Uygulama ve API tasarım

  1. MessagePack tür denetleme API (Java, C ve D) vardır

    MessagePack statik-yazma destekler.

    Dinamik yazarak JSON veya BSON ile kullanılan Ruby gibi dinamik diller için yararlı, Python veya JavaScript. Ama statik diller için zahmetli. Sıkıcı tip kontrol kodları yazmanız gerekir.

    MessagePack tür denetleme API sağlar. Dinamik olarak yazılan dönüştürür statik olarak yazılan nesneleri içine nesneleri. İşte bir örnek (C ):

    #include <msgpack.hpp>
    
    class myclass {
    private:
        std::string str;
        std::vector<int> vec;
    public:
        // This macro enables this class to be serialized/deserialized
        MSGPACK_DEFINE(str, vec);
    };
    
    int main(void) {
        // serialize
        myclass m1 = ...;
    
        msgpack::sbuffer buffer;
        msgpack::pack(&buffer, m1);
    
        // deserialize
        msgpack::unpacked result;
        msgpack::unpack(&result, buffer.data(), buffer.size());
    
        // you get dynamically-typed object
        msgpack::object obj = result.get();
    
        // convert it to statically-typed object
        myclass m2 = obj.as<myclass>();
    }
    
  2. MessagePack Çeşitli SERVİSLER vardır

    -Kontrol tipi API, MessagePack desteklediği SERVİSLER ile ilgili. (şartname edinilebilir: 10**)

    Protokol Tamponlar ve Tasarruf AZALMASINA (dinamik-yazma desteği yok) gerektirir ve daha olgun AZALMASINA uygulanmasını sağlamak.

  3. MessagePack akış API var (Ruby, Python, Java, C , ...)

    MessagePack deserializers streaming destekler. Bu özellik, ağ iletişimi için yararlıdır. İşte bir örnek (Ruby):

    require 'msgpack'
    
    # write objects to stdout
    $stdout.write [1,2,3].to_msgpack
    $stdout.write [1,2,3].to_msgpack
    
    # read objects from stdin using streaming deserializer
    unpacker = MessagePack::Unpacker.new($stdin)
    # use iterator
    unpacker.each {|obj|
      p obj
    }
    

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Jana Williams

    Jana William

    17 AĞUSTOS 2011
  • Jucyber Tutoriais

    Jucyber Tuto

    8 EYLÜL 2009
  • Sergio Lafuente Rubio

    Sergio Lafue

    11 Aralık 2008