2010-05-12 12 views
6

Google Protokolü Arabelleklerini kullanarak, kodladığım tüm iletiler için maksimum boyut ayarlayabilir miyim?Google Protokolü Arabellekleri - Sabit boyutlu arabellek?

Kodlarımın ne zaman X bayttan daha büyük olduğunu bilmezsem, Google Protobuff'lar her zaman Y boyutunda bir arabelleğe sahip olurlar ve daha az miktarda veri verirsek, Y boyutuna sığdırırlar mı?

cevap

5

Protokol arabellekleri için tel formatı bu önemsiz olmaz; Ben bunu yapmak için bir şey farkında değilim, ancak bir seçenek kendi uzunluk üstbilgisi ve gerektiği gibi ekstra veri ile ped ile bir arabellek içine serileştirmek olacaktır.

Bu, varsayılan olarak eklenmediği için bir uzunluk öneki eklemeniz gerekir, aksi takdirde arabellek sonunda çöp okuyor olur. Takip eden 0'lar bile yasal olmayacaktı (bir alan numarası arıyor olacaktı).

Ben C++ veya Jon'un C# sürümü yorum yapamam, ama benim C# sürümü (protobuf-net), siz (denenmemiş) böyle bir şey yapmak mümkün olmalıdır:

using(var ms = new MemoryStream(fixedLength)) { 
    ms.SetLength(fixedLength); 
    Serializer.SerializeWithLengthPrefix(ms, obj); 
    if(ms.Length > fixedLength) { /* boom */ } 
    byte[] arr = ms.ToArray(); // use this 
} 

Bu DeserializeWithLengthPrefix kullanarak da iyi seri hale getirilmelidir.


Soruları (yorumları); SerializeWithLengthPrefix, protobuf-net özel bir yöntemdir; Orada olabilir C++ sürümünde bir şey olabilir, ama oldukça basit. En kolay yolu karalama bu uygulamaktır:

  • biz
  • 4 bayt atlamak (veya 00- yazma ne kadar gerçek veri belirtmek için bir sabit uzunluğa (4 bayt) başlığı bırakacak varsayalım 00-00-00)
  • şimdi sadece
  • tampon başlangıcında geri bu değeri yazma yazdım kaç bayt
  • bulmak tampon geri kalanına serialize
  • Açıkçası ters 0

:

  • 4 bayt okuma ve O protobuf- bir küçük biraz daha karmaşıktır kadar veri

olarak bir int

  • serisini olarak yorumlanması net, birkaç seçenek daha sunar (int'nin nasıl kodlanması gerektiğine ve tümünün% 100 değerde bir protobuf akışı olarak kabul edilip edilemeyeceği için özellikle şüpheli Sabit genişlikli kodlama ve "alan 0" kullanması için SerializeWithLengthPrefix sorsaydım bu davranışı daha yeni tarif ettim.

  • +0

    Çok teşekkürler Marc, her zaman yararlı. SerializeWithLengthPrefix'in aslında ne yaptığını daha ayrıntılı olarak açıklayabilir misiniz? Tekrar teşekkürler! – Roey

    +0

    Bir şey daha, ben C++ sürümü Protokolü Buffers .... ile deserializing var DeserializeWithLengthPrefix C++ sürümünde bazı biçimde var mı? – Roey

    +0

    @Roey - Bu bilgiyi şu dilde düzenleyeceğim ... –

    İlgili konular