2010-03-30 14 views
23

Z komentarzem na announcement blog post:Czy istnieje standardowe odwzorowanie między JSON i buforami protokołów?

chodzi JSON: JSON jest skonstruowany podobnie do Protokołu buforów, ale bufor protokół w formacie binarnym jest nadal mniejsze i szybsze do kodowania. JSON czyni wielką kodowanie tekstu dla buforów protokołów, chociaż - to trywialne napisać koder/dekoder który konwertuje arbitralne Protocol wiadomości do i od JSON, używając Protobuf odbicie. Jest to dobry sposób na komunikowanie się z aplikacjami AJAX, , ponieważ pobranie użytkownika z pełnego dekodera protobuf po odwiedzeniu strony może być zbyt duży.

może być trywialne gotować się odwzorowania, ale jest jedno „oczywiste” mapowania między dwoma że dowolne dwa oddzielne zespoły dev naturalnie osiedlenie się na? Jeśli dwa produkty obsługiwały dane PB i mogły współpracować, ponieważ udostępniały tę samą specyfikację .proto, zastanawiam się, czy nadal będą w stanie współpracować, jeśli niezależnie wprowadzą odbicie JSON tego samego spec. Mogą być podejmowane arbitralne decyzje, np. powinny wartości wyliczeniowe być reprezentowane przez ciąg znaków (aby można je było odczytać jako typowy JSON) lub ich całkowitą wartość?

Czy istnieje ustalone mapowanie i wszelkie implementacje open source do generowania koderów/dekoderów JSON ze specyfikacji .proto?

Odpowiedz

6

Z tego co widziałem, Protostuff jest projekt wykorzystania do jakichkolwiek prac PB na Jawie, w tym szeregowania go jako JSON, na podstawie definicji protokołu. Nie używałem go sam, tylko słyszałem dobre rzeczy.

+0

Brak nowych wpisów [CHANGELOG] (https://github.com/protostuff/protostuff/blob/master/CHANGELOG.md) od 2015 r. Brak zmian przez 5 miesięcy. Konający projekt? – Raedwald

1

Jeszcze jedna myśl: jeśli obiekty protobuf mają obiekty pobierające/ustawiające lub odpowiednio nazwane pola, można po prostu użyć powiązania danych procesora JSON z Jackson. Domyślnie obsługuje publiczne programy pobierające, wszelkie ustawiające i publiczne pola, ale są to domyślne poziomy widoczności i mogą być zmieniane. Jeśli tak, Jackson może serializować/deserializować generowane POJO protobuf bez problemów.

Użyłem tego podejścia z obiektami generowanymi przez Thrift; jedyną rzeczą, którą musiałem skonfigurować, było wyłączenie serializacji różnych metod "isXXX()", które Thrift dodaje do sprawdzania, czy pole zostało jawnie przypisane, czy nie.

+2

To nie jest takie proste: obiekty Java generowane ze specyfikacji protobuf są tylko do odczytu i używają klasy Builder do tworzenia nowych instancji. – djjeck

+0

Mogło się to zmienić, ale wróciłem do dnia, w którym myślę, że właściwości nie były ostateczne i dlatego można je zmienić za pomocą Odbicia; dlatego Jackson może je modyfikować, nawet jeśli zwykły kod Java nie może. – StaxMan

2

Potrzebowałem do marszałka z GeneratedMessageLite do obiektu JSON, ale nie musiałem robić nieprzyjemnego. Nie mogłem użyć biblioteki protobuf w odpowiedzi Pangei, ponieważ nie działa z opcją LITE_RUNTIME. Nie chciałem też obciążać naszego już dużego systemu, generując więcej skompilowanego kodu dla istniejących buforów protokołów. Dla mashalling do JSON, poszedłem z tego prostego rozwiązania do organizowania

final Person gpb = Person.newBuilder().setName("Bill Monroe").build(); 
    final Gson gson = new Gson(); 
    final String jsonString = gson.toJson(gpb); 
0

Przede wszystkim myślę, że powinno się rozumieć bardzo uważnie na wkładanie wysiłku w konwersji zestawu danych do protobuffs. Oto moje powody zamiany zestawu danych na protobuffy:

  1. Bezpieczeństwo typu: gwarancja formatu rozpatrywanych danych.
  2. nieskompresowana pamięć wydruku danych.Powodem, dla którego wspominam o nieskompresowanym, jest to, że kompresja po wpisie nie ma dużej różnicy w wielkości skompresowanego JSON i proto, ale kompresja ma z tym związany koszt. Również prędkość serializacji/deklinalizacji jest prawie podobna, w rzeczywistości Jackson json jest szybszy niż protobuffy. Proszę sprawdzić poniższy link, aby uzyskać więcej informacji http://technicalrex.com/2014/06/23/performance-playground-jackson-vs-protocol-buffers/
  3. Protobuffs musi być przesyłany przez sieć dużo.

mówią, że po konwersji Twój zbiór danych w formacie JSON Jackson w ten sposób, że definicja ProtoBuff jest zdefiniowany to może bardzo łatwo zostać bezpośrednio odwzorowywany na format ProtoBuff pomocą Protostuff: JsonIoUtil: funkcję mergeFrom. Podpis funkcji:

public static <T> void mergeFrom(JsonParser parser, T message, Schema<T> schema, boolean numeric) 

Odniesienie do protostuff

Powiązane problemy