Я верю, что все знают, что такое JSON. Если вы не знаете, это действительно нет. GOOGLE. Я не буду здесь ничего представить.
Я предполагаю, что все редко слышат о Protobuffer, но если это будет сделано Google, я считаю, что все будут заинтересованы в том, чтобы попробовать это. В конце концов, экспорт Google в основном является высококачественным продуктом.
Protobuffer - это протокол передачи, похожий на JSON. На самом деле, это нельзя сказать, что это протокол, это просто вещь передачи данных.
Так в чем же разница между ним и JSON?
Кросс-языку, это одно из его преимуществ. Он поставляется с компилятором, протоком, который должен быть только скомпилирован с ним, и может быть составлен в код Java, Python и C ++. На данный момент есть только эти три, так что не думайте о других на данный момент, и тогда вы можете использовать их напрямую, не написав какой -либо другой код. Даже проанализированные уже идут с ними. JSON, конечно, является межязычным, но этот перекрестный язык основан на написании кода.
Если вы хотите узнать больше, вы можете проверить это:
https://developers.google.com/protocol-buffers/docs/overview
Хорошо, без лишних слов, давайте посмотрим, почему нам нужно сравнить Protobuffer (далее называемый GPB) и JSON.
1. Поскольку JSON имеет определенный формат и существует в персонажах, в объеме данных все еще есть место для сжатия. Когда количество больших данных на GPB намного меньше, чем у JSON, мы можем увидеть пример ниже.
2. Разница в эффективности между библиотеками JSON довольно велика, и между библиотеками Джексона и GSON существует разрыв около 5-10 (это было протестировано только один раз, если есть какие-либо ошибки, пожалуйста, погладите). GPB нуждается только в одном, и нет никакой разницы между так называемыми несколькими библиотеками. Конечно, этот момент только что задумается за цифры, и его можно игнорировать.
Разговор дешево, просто покажите мне код.
В мире программирования код всегда является королем, так что давайте просто перейдем к коду.
Перед загрузкой кода вам нужно сначала загрузить Protobuffer, здесь:
https://github.com/google/protobuf
1. Прежде всего, GPB должен иметь файл с аналогичными определениями класса, называемый прото -файлом.
Давайте возьмем пример студентов и учителей, чтобы сделать пример:
У нас есть следующие два файла: student.proto
опция java_package = "com.shun"; опция java_outer_classname = "StudentProto"; Сообщение Студент {Требуется int32 id = 1; Необязательное название строки = 2; Необязательный int32 возраст = 3; } </span> Учитель.proto
Импорт "Студент.proto"; опция java_package = "com.shun"; опция java_outer_classname = "Учитель prongeproto"; Учитель сообщений {требуется int32 id = 1; Необязательное название строки = 2; Повторяемый студент студента_листа = 3; } </span> Здесь мы столкнулись с некоторыми странными вещами:
Импорт, Int32, повторный, обязательный, необязательный, опция и т. Д.
1) Импорт означает импорт других прото -файлов
2) Требуется и необязательно указывает, является ли поле необязательным. Это определяет, какая обработка будет выполнена Protobuffer, если поле имеет значение или нет. При необходимости помечено, но при обработке поле не пропускает значение, сообщается об ошибке; Если необязательно отмечено, значение не будет передано, проблем не будет.
3) Я полагаю, что вы можете понять повторение, что означает, что он повторяется, он похож на список в Java.
4) Сообщение эквивалентно классу
5) Опция представляет опцию, где Java_Package представляет имя пакета, то есть имя пакета, используемое при генерации кода Java. java_outer_classname - это имя класса. Обратите внимание, что это имя класса не может быть таким же, как и имя класса в сообщении ниже.
Что касается других вариантов и связанных типов, пожалуйста, посетите официальную документацию.
2. С этими документами, что мы можем сделать?
Помните компилятор, загруженный выше. Разанизируйте его, и мы получаем проток.exe. Конечно, это основано на Windows. Я не делал другие системы. Если вам интересно, вы можете попробовать.
Добавить в путь (это легко добавить или нет, это просто неудобно), а затем вы можете сгенерировать файл класса, который нам нужен, через приведенный выше файл.
protoc --java_out = patht to сохранить исходный код -proto_path = path to proto -файл proto contecial файл
-proto_path Определяет путь папки прото-файла, а не один файл, он в основном используется для поиска импорта файла и может быть пропущена
Если мне нужно поместить исходный код в d:/protobuffervsjson/src, мой прото -файл хранится в d:/protofiles
Тогда моя команда компиляции:
protoc --java_out = d:/protobuffervsjson/src d: /protofiles/teacher.proto d: /protofiles/student.proto
Обратите внимание, что в последнем файле здесь нам нужно указать все файлы, которые необходимо собирать.
После компиляции вы можете увидеть сгенерированный файл.
Код не опубликован, слишком много. Вы можете посмотреть в частном порядке. В коде много строителей. Я считаю, что вы будете знать, что это режим застройщика с первого взгляда.
В настоящее время вы можете вставить код в свой проект, и, конечно, есть много ошибок.
Помните исходный код, который мы скачали ранее? Разанизируйте это, не будь безжалостным. Затем найдите src/main/java/, чтобы скопировать один из них в свой проект. Конечно, вы также можете скомпилировать муравей или мавена, но я не знаком с этими двумя вещами, поэтому я больше не буду уродливым. Я все еще привык копировать их непосредственно в проект.
Ошибка кода, ха -ха, нормально. По какой -то причине Google настаивает на том, чтобы оставить такую яму для нас.
Вернитесь в /java в каталоге Protobuffer и посмотрите readme.txt и найдите предложение:
Посмотрев на это, я чувствую, что этот код будет немного странным, как будто он неправильно. В любом случае, я не выполнил это, и моя команда:
<span style = "font-size: 16px;"> protoc --java_out = или путь прото-файла, где расположен код (вот путь файла descriptor.proto) </span>
После выполнения мы видим, что в коде нет ошибок.
3. Следующий шаг, конечно, тестирование.
Давайте сначала проведем тест на записи GPB:
пакет com.shun.test; Импорт java.io.fileOutputStream; импортировать java.io.ioexception; импортировать java.util.arraylist; импортировать java.util.list; Импорт com.shun.studentproto.student; Импорт com.shun.teacherproto.teacher; открытый класс ProtowRitetest {public static void main (string [] args) бросает ioException {student.builder stubuilder = student.newbuilder (); stubuilder.setage (25); stubuilder.setid (11); stubuilder.setName ("Shun"); // Список строительств <Trade> StubuilderList = new ArrayList <Tdent> (); stubuilderlist.add (stubuilder.build ()); Учитель.Builder Teabuilder = учитель.newbuilder (); teabuilder.setid (1); teabuilder.setname ("testtea"); teabuilder.addallStudentlist (Stubuilderlist); // Написать gpb для файла fileOutputStream fos = new FileOutputStream ("c: //users//shun//desktop//test//test.protoout"); Teabuilder.build (). WriteTo (FOS); fos.close (); }} </span> Давайте посмотрим на файл, если ничего неожиданного не произошло, он должен был быть сгенерирован.
После того, как он сгенерирован, мы должны прочитать его обратно.
пакет com.shun.test; импортировать java.io.fileinputstream; Импорт java.io.filenotFoundException; импортировать java.io.ioexception; Импорт com.shun.studentproto.student; Импорт com.shun.teacherproto.teacher; открытый класс ProtoreAdtest {public static void main (string [] args) выбрасывает filenotfoundexception, ioException {учитель учитель = учитель.parsefrom (new fileInputStream ("c: //users//shun//desktop//test//test.protoout")); System.out.println ("идентификатор учителя:" + учитель.getid () + ", имя:" + учитель.getname ()); для (Student STU: Support.GetStudentListlist ()) {System.out.println ("ID студента:" + stu.getId () + ", имя:" + stu.getName () + ", возраст:" + stu.getage ()); }}}} </span> Код очень прост, потому что весь код, сгенерированный GPB, сделан для нас.
Выше знает основное использование. Мы сосредоточимся на разнице между GPB и JSON, сгенерированным размерами файлов. Я не буду публиковать подробный код JSON здесь. Я опубликую пример позже. Если вы заинтересованы, вы можете скачать его.
Здесь мы используем Gson для анализа JSON. Ниже приведено только код для преобразования объекта в JSON и написания файла:
Я не буду писать основные определения ученика и учителя двух классов, просто сделайте это так, как вам нравится, код заключается в следующем:
пакет com.shun.test; Импорт java.io.fileWriter; импортировать java.io.ioexception; импортировать java.util.arraylist; импортировать java.util.list; Импорт com.google.gson.gson; Импорт com.shun.student; Импорт com.shun.teacher; открытый класс gsonwritetest {public static void main (string [] args) бросает ioException {студент stu = new Student (); stu.setage (25); stu.setid (22); stu.setname ("Shun"); Список <Tlade> stulist = new ArrayList <toodTude> (); Stulist.add (Stu); Учитель учителя = новый учитель (); Учитель.setid (22); Учитель.setName ("Shun"); Учитель.setstulist (Stulist); String result = new gson (). Tojson (учитель); FileWriter fw = new FileWriter ("c: // users // shun/desktop // test // json"); fw.write (результат); fw.close (); }} </span> Далее мы официально вводим наш настоящий тестовый код. Вначале мы просто помещаем объект в список. Затем мы тестируем размеры файлов, сгенерированные GPB и JSON, по очереди.
Улучшение предыдущего кода GPB, пусть он генерирует различное количество списков и регенерированных файлов:
пакет com.shun.test; Импорт java.io.fileOutputStream; импортировать java.io.ioexception; импортировать java.util.arraylist; импортировать java.util.list; Импорт com.shun.studentproto.student; Импорт com.shun.teacherproto.teacher; открытый класс ProtowRitetest {public Static Final int size = 100; public static void main (string [] args) бросает ioException {// Список строительств <toodTuction> stubuilderlist = new ArrayList <toodTude> (); for (int i = 0; i <size; i ++) {Student.Builder stubuilder = Student.NewBuilder (); stubuilder.setage (25); stubuilder.setid (11); stubuilder.setName ("Shun"); stubuilderlist.add (stubuilder.build ()); } Учитель.Builder TeaBuilder = Secury.NewBuilder (); teabuilder.setid (1); teabuilder.setname ("testtea"); teabuilder.addallStudentlist (Stubuilderlist); // Написать gpb для файла fileOutputStream fos = new FileOutputStream ("c: // users // shun // desktop // test // proto-" + size); Teabuilder.build (). WriteTo (FOS); fos.close (); }} </span> Размер здесь изменен на тестовый номер, который мы сказали выше по очереди, и вы можете получить следующее:
Тогда давайте посмотрим на код испытаний JSON:
пакет com.shun.test; Импорт java.io.fileWriter; импортировать java.io.ioexception; импортировать java.util.arraylist; импортировать java.util.list; Импорт com.google.gson.gson; Импорт com.shun.student; Импорт com.shun.teacher; открытый класс GsonWritetest {public static final int size = 100; public static void main (string [] args) бросает ioException {list <Tood> stulist = new ArrayList <toodte> (); for (int i = 0; i <size; i ++) {студент stu = new Student (); stu.setage (25); stu.setid (22); stu.setname ("Shun"); Stulist.add (Stu); } Учитель учителя = новый учитель (); Учитель.setid (22); Учитель.setName ("Shun"); Учитель.setstulist (Stulist); String result = new gson (). Tojson (учитель); FileWriter FW = новый файл -автора ("c: // users // shun // desktop // test // json" + size); fw.write (результат); fw.close (); }} </span> Тот же метод используется для изменения размера и выполнения соответствующих тестов.
Ясно видно, что размер файла JSON и GPB будет иметь большую разницу, когда объем данных постепенно увеличивается. JSON, очевидно, намного больше.
Таблица выше должна быть яснее. GPB больших данных очень доминирует, но в целом клиент и сервер не будут напрямую взаимодействовать с такими большими данными. Большие данные в основном встречаются в передаче сервера. Если вы столкнетесь с потребностями, вам нужно каждый день передавать сотни m файлов журнала на другой сервер, то GPB здесь может быть большой помощью.
Говорят, что это сравнение глубины, но основным сравнением является размер, и сравнение времени не слишком много, и не существует большой разницы.
Для анализа Gson, выбранного в статье, заинтересованные друзья могут выбрать Jackson или Fastjson, или другого, но сгенерированный размер файла одинаково, но время разбора отличается.