2016-09-29 6 views
6

Korzystanie Microsoft Bond (the C# library in particular), widzę, że ilekroć struct Bond jest zdefiniowana, to wygląda to tak:Co oznaczają numery członków w programie Microsoft Bond?

struct Name 
{ 
    0: type name; 
    5: type name; 
    ... 
} 

Co te numery (0, 5, ...) myśli?

Czy wymagają specjalnego traktowania w dziedziczeniu? (Czy muszę się upewnić, że nie przesłonię elementów o tym samym numerze zdefiniowanym w moim przodku?)

+0

Dokumentacja związana z ty, mówi 'Wartość porządkowej musi niepodpisany 16- bitowa liczba całkowita, unikalna dla każdego pola w typie '. – TZHX

Odpowiedz

3

Pola porządkowe to unikalna tożsamość każdego pola. Podczas serializacji do oznaczonych protokołów binarnych numery te są używane do wskazania, które pola znajdują się w polu danych. Nazwy pól nie są używane. (Zmiana nazwy pola w pliku .bond powoduje, że nie łamie zserializowanej kompatybilności danych binarnych [chociaż zobacz poniżej zastrzeżenia dotyczące protokołów tekstowych]). Liczby są mniejsze niż ciągi znaków, co pomaga zmniejszyć rozmiar bloku danych, ale także poprawia jakość serializacji/czas deserializacji.

Nie można ponownie użyć tego samego numeru porządkowego w obrębie tej samej struktury.

Nie ma specjalnego traktowania, gdy dziedziczysz z struct (lub jeśli masz strukturę struct wewnątrz struktury). Bond utrzymuje porządek dla poszczególnych struktur. Konkretnie, po to legalne i będzie działać:

namespace inherit_use_same_ordinal; 

struct Base { 
    0: string field; 
} 

struct Derived : Base { 
    0: bool field; 
} 

zastrzeżenie o serializacji tekstowych protokołów, takich jak Proste JSON i XML: Proste tych protokołów wykorzystują nazwę pola jako identyfikator pola. W tych protokołach zmiana nazwy pola powoduje zserializowaną kompatybilność danych.

Ponadto prosty JSON i prosty XML spłaszczają hierarchię dziedziczenia, więc ponowne użycie nazw w Bazie i Pochodnym spowoduje konflikt. Oba mają sposoby obejścia tego. W przypadku prostego kodu XML, SimpleXml.Settings.UseNamespaces parameter can be set to true może emitować w pełni kwalifikowane nazwy.

dla prostych JSON The Bond attribute JsonName mogą być wykorzystane do zmiany nazwy stosowane do prostego JSON serializacji, aby uniknąć konfliktu:

struct Derived : Base { 
    [JsonName("derived_field")] 
    0: bool field; 
}