2011-12-22 15 views
11

Bu yöntem son argüman olarak bir tamsayı kabul eder, ancak tam olarak ne kullanacağımı anladığımdan emin değilim.Protobuf-net SerializeWithLengthPrefix etiket argümanı nedir?

Serializer.SerializeWithLengthPrefix(stream, object, PrefixStyle.Base128, [tag]); 

Aynı, karşılık gelen Deserialize yöntemi için de geçerlidir.

İletileri, istenmeyen iletileri filtrelemek için seri hale getirme konusunda bir çeşit "sorgulama" özelliği eklemek üzere etiketlemenin bir yolu var mı, yoksa başka herhangi bir kullanımı var mı?

cevap

9

Temel olarak, bu (olmak zorunda değildir, ancak) (*WithLengthPrefix yaklaşım kullanıldığında) varsayımı için, eklenen mesaj "tip" dikkat çekmek için kullanılır olabilir ek işaretleyici orada olduğu aynı akışta birden çok mesajdır. dahil olmak tarafından

, aynı zamanda tüm bileşik akışı kendisi tamamen geçerlidir protobuf mesajı olduğunu gösterir. Bu kullanmanın

Yolları: Bir List<Foo> seri ve daha sonra tekrar tekrar nesnelerin heterojen dizi ile (uzunlukta önek) tek tek Foo ürün, veya tam tersi

  • serisini

    • , Etikete göre tip çözünürlüğüne izin vermek için Serializer.NonGeneric API'sini kullanabilirsiniz, yani "eğer 1 sonra Fatura, 2 ise Sipariş, 3 ise 3, sonra 4, sonra Müşteri" vb. Bir ileti gönderme aygıtı olarak bir NetworkStream kullanıyorsa. (Tipine göre farklı bir etiket kullanarak) Bu yaklaşım dere kapalı nesneleri okumak ve bir sonraki mesajın önceden tip bilmeden, bunları doğru serisini sağlar

    O eğer bu ihmal etmek mümkündür istiyorum - sadece sıfır (IIRC) geçmek. Bu, eklenen iletinin başına bir bayt (genellikle) kaydedecektir, ancak: bu, akışın artık geçerli bir protobufun kendisi olmadığı anlamına gelir. Tabii ki okunurken sıfırdan geçerek okunabilir.

  • +1

    Bu etiketi neden dahil etmek doğru bir protobuf mesajı yapıyor? Listede yer alan öğeleri tek tek etiketsiz hale getiremez misiniz? – Simone

    +0

    Ayrıca, tip çözünürlüğü etiketini uygulama koduyla gerçekleştirmelisiniz, değil mi? – Simone

    +1

    @Simone, * karma * mesajını geçerli bir protobuf yapar, çünkü tekrarlanan MessageType (".proto)" [tag] [length] [dataload] ... [tag] [length] dizisi olarak kodlanır yükü]". Bu nedenle etiketi ile geçerli bir protobuf ve olmadan: değil. Re tipi çözünürlük; normalde evet, kasten platform bağımsız olduğu için; Ancak, protobuf-net ayrıca tel üzerinde bazı sınırlı tip bilgileri dahil etmek için bazı * ek * desteği içerir. –