2011-12-22 3 views
11

Ta metoda przyjmuje jako ostatni argument liczbę całkowitą, ale nie jestem pewna, czy rozumiem, co dokładnie powinienem użyć.Co to jest argument znacznika protobuf-net SerializeWithLengthPrefix dla?

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

To samo dotyczy odpowiedniej metody Deserialize.

Czy jest to po prostu sposób na oznaczanie wiadomości w celu dodania funkcji "sprawdzania" w przypadku deserializacji, aby odfiltrować niechciane wiadomości lub czy ma inne zastosowania?

Odpowiedz

9

Zasadniczo, jest to dodatkowy marker że może być (choć nie musi być) stosowane zwrócić uwagę na „typ” wiadomości są dodawane, ponieważ domniemania (przy zastosowaniu podejścia *WithLengthPrefix) jest to, że istnieje to wiele wiadomości w tym samym strumieniu.

przez wchodzących, oznacza to także, że całe kompozytu strumień sam całkowicie ważny komunikat buforów.

sposoby wykorzystania tego:

  • można serializować List<Foo>, a następnie wielokrotnie deserializowania (o długości prefiksu) poszczególnych Foo przedmioty i vice-versa
  • z heterogenicznego zbioru obiektów, można użyć interfejsu API Serializer.NonGeneric, aby umożliwić rozpoznawanie typu w oparciu o znacznik, tj. kod równoważny "jeśli 1 to faktura, jeśli 2 to zamówienie, jeśli 3 to pomiń, jeśli 4 to klient", itd. - jest to szczególnie przydatne jeśli używasz urządzenia NetworkStream jako urządzenia do wysyłania wiadomości. Takie podejście (stosując inny znacznik danego typu) umożliwia odczytywanie obiektów off strumienia, a deserializowania je poprawnie, nie znając z wyprzedzeniem typ następnej wiadomości

Możliwe jest pominięcie tego, jeśli chcę - po prostu prześlij zero (IIRC). Spowoduje to zapisanie (zazwyczaj) bajtu na wiadomość dołączoną, ale: oznacza, że ​​strumień nie jest już prawidłowym protobufem. Oczywiście można go odczytać, przekazując zero podczas czytania.

+1

Dlaczego dodanie znacznika powoduje, że jest to ważna wiadomość protokołu protobuf? Nie możesz deserializować poszczególnych elementów na liście bez tagu? – Simone

+0

Rozdzielczość typu przy użyciu znacznika musi być wykonana przez kod aplikacji, prawda? – Simone

+1

@Simone sprawia, że ​​* composite * message jest poprawnym protobuf, ponieważ 'repeatTypeType' (w .proto) jest zakodowany jako sekwencja" [tag] [length] [payload] ... [tag] [length] [ ładunek danych ". Stąd z tagiem jest to poprawne protobuf, a bez: nie jest. Rozdzielczość typu re; zwykle tak, ponieważ jest to celowo niezależne od platformy; jednak protobuf-net zawiera także * dodatkowe * wsparcie dla włączenia pewnych ograniczonych informacji o typie do drutu. –