Je crois que tout le monde sait ce qu'est JSON. Si vous ne le savez pas, c'est vraiment sorti. GOOGLE. Je ne présenterai rien ici.
Je suppose que tout le monde entend rarement parler de Protobuffer, mais si cela est fait par Google, je pense que tout le monde sera intéressé à l'essayer. Après tout, les exportations de Google sont principalement des produits de haute qualité.
Protobuffer est un protocole de transmission similaire à JSON. En fait, il ne peut pas être considéré comme un protocole, c'est juste une chose de transmission de données.
Alors, quelle est la différence entre elle et JSON?
Cross-Language, c'est l'un de ses avantages. Il est livré avec un compilateur, Protoc, qui n'a qu'à être compilé avec lui et peut être compilé en code Java, Python et C ++. Il n'y a que ces trois pour le moment, alors ne pensez pas aux autres pour le moment, puis vous pouvez les utiliser directement sans écrire aucun autre code. Même les analysés viennent déjà avec eux. JSON est bien sûr en langage transversal, mais cette langue croisée est basée sur l'écriture de code.
Si vous voulez en savoir plus, vous pouvez le vérifier:
https://developers.google.com/protocol-buffers/docs/overview
D'accord, sans plus tarder, jetons un coup d'œil à la raison pour laquelle nous devons comparer Protobuffer (ci-après GPB) et JSON.
1. Parce que JSON a un certain format et existe dans les caractères, il y a encore place à la compression dans la quantité de données. Lorsque la quantité de Big Data sur GPB est beaucoup plus petite que celle de JSON, nous pouvons voir l'exemple ci-dessous.
2. La différence d'efficacité entre les bibliothèques JSON est assez grande, et il y a un écart d'environ 5 à 10 entre les bibliothèques Jackson et GSON (cela n'a été testé qu'une seule fois, s'il y a une erreur, veuillez le tapoter). GPB n'en a pas besoin, et il n'y a pas de différence entre les soi-disant bibliothèques. Bien sûr, ce point est juste compensé pour les chiffres, et il peut être ignoré.
Parler est bon marché, montrez-moi simplement le code.
Dans le monde de la programmation, le code est toujours le roi, alors allons simplement au code.
Avant de télécharger le code, vous devez d'abord télécharger le protobuffer, ici:
https://github.com/google/protobuf
1. Tout d'abord, GPB doit avoir un fichier avec des définitions de classe similaires, appelée fichier Proto.
Prenons l'exemple des élèves et des enseignants pour faire un exemple:
Nous avons les deux fichiers suivants: Student.proto
option java_package = "com.shun"; Option java_outer_classname = "StudentProto"; Message Student {requis int32 id = 1; Nom de chaîne facultatif = 2; INT32 FACTIONNELLE AGE = 3; } </span> professeur.proto
importer "Student.proto"; option java_package = "com.shun"; option java_outer_classname = "enseignante"; Message Teacher {requis INT32 ID = 1; Nom de chaîne facultatif = 2; Student Student_list répété = 3; } </span> Ici, nous avons rencontré des choses étranges:
Importer, INT32, répété, requis, facultatif, option, etc.
1) Importer signifie l'importation d'autres fichiers proto
2) requis et facultatif indique si le champ est facultatif. Cela détermine ce que le traitement sera effectué par le protobuffer si le champ a une valeur ou non. Si nécessaire est marqué, mais lors du traitement, le champ ne transmet pas la valeur, une erreur sera signalée; Si facultatif est marqué, aucune valeur ne sera transmise, il n'y aura aucun problème.
3) Je crois que vous pouvez comprendre répété, ce qui signifie s'il est répété, il est similaire à la liste de Java.
4) Le message est équivalent à la classe
5) L'option représente l'option, où Java_Package représente le nom du package, c'est-à-dire le nom du package utilisé lors de la génération de code Java. java_outer_classname est le nom de classe. Notez que ce nom de classe ne peut pas être le même que le nom de classe dans le message ci-dessous.
Quant aux autres options et types connexes, veuillez visiter la documentation officielle.
2. Avec ces documents, que pouvons-nous faire?
N'oubliez pas le compilateur téléchargé ci-dessus. Décompressez-le et nous obtenons un protoc.exe. Bien sûr, cela est basé sur Windows. Je n'ai pas fait d'autres systèmes. Si vous êtes intéressé, vous pouvez l'essayer.
Ajouter au chemin (il est facile d'ajouter ou non, il est tout simplement gênant), puis vous pouvez générer le fichier de classe dont nous avons besoin via le fichier ci-dessus.
protoC --java_out = chemin pour stocker le code source --proto_path = le fichier PROTO vers le fichier Proto Fichier spécifique
--proto_path spécifie le chemin du dossier du fichier proto, pas un seul fichier, il est principalement utilisé pour l'importation de recherche de fichiers et peut être omis
Si j'ai besoin de mettre le code source en d: / protobuffervsjson / src, mon fichier proto est stocké en d: / protofiles
Alors ma commande de compilation est:
protoc --java_out = d: / protobuffervsjson / src d: /protofiles/teacher.proto d: /protofiles/student.proto
Notez que dans le dernier fichier ici, nous devons spécifier tous les fichiers qui doivent être compilés.
Après compilation, vous pouvez voir le fichier généré.
Le code n'est pas trop affiché. Vous pouvez jeter un œil en privé. Il y a beaucoup de constructeurs dans le code. Je crois que vous saurez que c'est le mode constructeur en un coup d'œil.
Pour le moment, vous pouvez coller le code dans votre projet, et bien sûr, il y a beaucoup d'erreurs.
Rappelez-vous le code source que nous avons téléchargé plus tôt? Décompressez-le, ne soyez pas impitoyable. Trouvez ensuite SRC / Main / Java / pour en copier l'un d'eux dans votre projet. Bien sûr, vous pouvez également compiler Ant ou Maven, mais je ne connais pas ces deux choses, donc je ne serai plus moche. J'ai toujours l'habitude de les copier directement dans le projet.
L'erreur de code, haha, normal. Pour une raison quelconque, Google insiste pour nous laisser une telle fosse.
Revenez à / java dans le répertoire Protobuffer et voyez un Readme.txt et trouvez une phrase:
Après l'avoir regardé, je pense que ce code sera un peu étrange, comme s'il était mal. Quoi qu'il en soit, je ne l'ai pas exécuté et ma commande est:
<span style = "font-size: 16px;"> protoC --java_out = ou le chemin du fichier proto où le code est placé (voici le chemin du fichier descriptor.proto) </span>
Après l'exécution, nous pouvons voir qu'il n'y a pas d'erreurs dans le code.
3. L'étape suivante est bien sûr les tests.
Faisons d'abord le test d'écriture GPB:
package com.shun.test; Importer java.io.fileOutputStream; Importer java.io.ioException; import java.util.arraylist; Importer java.util.list; import com.shun.studentproto.student; import com.shun.teacherproto.teacher; classe publique ProtowRiteTest {public static void main (String [] args) lève ioException {Student.Builder Stubuilder = Student.newBuilder (); Stubuilder.Setage (25); Stubuilder.setid (11); Stubuilder.setName ("shun"); // Construire la liste de liste <Student> StubuilderList = new ArrayList <Student> (); StubuilderList.add (Stubuilder.Build ()); Teacher.Builder TeaBuilder = Teacher.NewBuilder (); TeaBuilder.setid (1); TeaBuilder.SetName ("TestTea"); TeaBuilder.AddalStudentList (StubuilderList); // Écrivez GPB dans File FileOutputStream fos = new FileOutputStream ("c: //users//shun//desktop//test//test.protoout"); TeaBuilder.Build (). WriteTo (FOS); fos.close (); }} </span> Regardons le fichier, si rien de inattendu ne se produit, il aurait dû être généré.
Une fois généré, nous devons le lire.
package com.shun.test; import java.io.fileInputStream; import java.io.filenotfoundException; Importer java.io.ioException; import com.shun.studentproto.student; import com.shun.teacherproto.teacher; classe publique ProtoreAdTest {public static void Main (String [] args) lève FileToTFoundException, ioException {Teacher Teacher = Teacher.PaSefrom (new FileInputStream ("c: //users//shun//desktop//test/test.protoout")); System.out.println ("Teacher ID:" + Teacher.getId () + ", Name:" + Teacher.getName ()); pour (Student Stu: Teacher.getStudentList ()) {System.out.println ("Student ID:" + stu.getID () + ", nom:" + stu.getName () + ", âge:" + stu.getage ()); }}}} </span> Le code est très simple car tout le code généré par GPB est fait pour nous.
Ce qui précède connaît l'utilisation de base. Nous nous concentrerons sur la différence entre les tailles de fichiers générées par GPB et JSON. Je ne publierai pas le code détaillé de JSON ici. Je publierai un exemple plus tard. Si vous êtes intéressé, vous pouvez le télécharger.
Ici, nous utilisons GSON pour analyser JSON. Ce qui suit n'est que le code de conversion de l'objet en JSON et d'écriture du fichier:
Je n'écrirai pas les définitions de base de l'élève et de l'enseignant des deux classes, faites-le comme vous le souhaitez, le code est le suivant:
package com.shun.test; import java.io.filewriter; Importer java.io.ioException; import java.util.arraylist; Importer java.util.list; import com.google.gson.gson; import com.shun.student; import com.shun.teacher; La classe publique GSONWRiteTest {public static void main (String [] args) lève ioException {Student Stu = new Student (); Stu.Setage (25); Stu.setid (22); Stu.setName ("shun"); Liste <Student> Stulist = new ArrayList <Student> (); Stulist.add (Stu); Enseignant enseignant = nouveau professeur (); Teacher.setid (22); enseign.SetName ("shun"); professeur.setStulist (Stulist); Résultat de la chaîne = new gson (). Tojson (professeur); FileWriter fw = new FileWriter ("C: // Users // Shun / Desktop // Test // JSON"); fw.write (résultat); fw.close (); }} </span> Ensuite, nous entrons officiellement notre véritable code de test. Au début, nous venons de mettre un objet dans la liste. Ensuite, nous testons les tailles de fichiers générées par GPB et JSON à leur tour.
Améliorez le code GPB précédent, laissez-le générer différents nombre de listes et de fichiers de régénération:
package com.shun.test; Importer java.io.fileOutputStream; Importer java.io.ioException; import java.util.arraylist; Importer java.util.list; import com.shun.studentproto.student; import com.shun.teacherproto.teacher; classe publique ProtowRiteTest {public static final int size = 100; public static void main (string [] args) lève ioException {// construire la liste de liste <Student> StubuilderList = new ArrayList <Student> (); pour (int i = 0; i <size; i ++) {Student.Builder Stubuilder = Student.newBuilder (); Stubuilder.Setage (25); Stubuilder.setid (11); Stubuilder.setName ("shun"); StubuilderList.add (Stubuilder.Build ()); } Teacher.Builder TeaBuilder = Teacher.newBuilder (); TeaBuilder.setid (1); TeaBuilder.SetName ("TestTea"); TeaBuilder.AddalStudentList (StubuilderList); // Écrivez GPB dans File FileOutputStream FOS = new FileOutputStream ("C: // Users // Shun // Desktop // test // proto-" + size); TeaBuilder.Build (). WriteTo (FOS); fos.close (); }} </span> La taille ici est modifiée par le numéro de test que nous avons dit ci-dessus à son tour, et vous pouvez obtenir ce qui suit:
Ensuite, jetons un coup d'œil au code de test JSON:
package com.shun.test; import java.io.filewriter; Importer java.io.ioException; import java.util.arraylist; Importer java.util.list; import com.google.gson.gson; import com.shun.student; import com.shun.teacher; classe publique GSONWRiteTest {public static final int size = 100; public static void main (String [] args) lève ioException {list <Student> stulist = new ArrayList <Student> (); pour (int i = 0; i <size; i ++) {Student Stu = new Student (); Stu.Setage (25); Stu.setid (22); Stu.setName ("shun"); Stulist.add (Stu); } Enseignant enseignant = nouveau professeur (); Teacher.setid (22); enseign.SetName ("shun"); professeur.setStulist (Stulist); Résultat de la chaîne = new gson (). Tojson (professeur); FileWriter fw = new FileWriter ("C: // Users // Shun // Desktop // Test // JSON" + Size); fw.write (résultat); fw.close (); }} </span> La même méthode est utilisée pour modifier la taille et effectuer des tests correspondants.
On peut clairement voir que la taille du fichier de JSON et GPB aura une grande différence lorsque le volume de données augmentera progressivement. JSON est évidemment beaucoup plus grand.
Le tableau ci-dessus doit être plus clair. Le GPB des mégadonnées est très dominant, mais en général, le client et le serveur n'interagiront pas directement avec ces mégadonnées. Les mégadonnées se produisent principalement dans la transmission du serveur. Si vous faites face aux besoins, vous devez transmettre chaque jour des centaines de m de fichiers journaux à un autre serveur, alors le GPB ici peut être d'une grande aide.
On dit qu'il s'agit d'une comparaison de profondeur, mais la comparaison principale est la taille, et la comparaison du temps n'est pas trop, ni beaucoup de différence.
Pour l'analyseur GSON sélectionné dans l'article, les amis intéressés peuvent choisir Jackson ou FastJson, ou autre, mais la taille générée du fichier est la même, mais le temps d'analyse est différent.