2010-06-22 4 views
3

Je suis nouveau à Protocol Buffers et voyant cela comme une bonne approche à suivre. J'ai créé un fichier proto, et en utilisant le compilateur, j'ai généré des beans Java.Protocole Buffers à classer?

En utilisant ces Java Beans, j'initialise l'objet et j'essaie de l'écrire dans un fichier. Le but est juste de voir la taille du fichier. Je n'ai pas de test client/serveur prêt pour le test via HTTP. J'essaie simplement de montrer à mon équipe à quel point la requête/réponse ressemble à l'utilisation de tampons de protocole.

code J'est quelque chose comme ceci:

fichier Proto === ===

Profile { 
    optional string name=1 
    optional string id=2 

    message DocGuids { 
    required string docguids=3 
    } 

    repeated DocGuids docguids=4 
} 

=== === Exemple de code

ProfileRequest.Builder profile = ProfileRequest.newBuilder(); 
profile.setName("John"); 
profile.setId("123"); 

for (int i=0;i<10;i++) { 
ProfileRequest.DocGuids.Builder docGuids = ProfileRequest.DocGuids.newBuilder(); 
docGuids.setDocguid(GUID.guid()); 
    profile.addDocguids(docGuids); 
} 

//write to disk 
try { 
    // Write the new address book back to disk. 
    FileOutputStream output = new FileOutputStream("c:\\testProto.txt"); 
    DataOutputStream dos = new DataOutputStream(output);     
     dos.write(profile.build().toByteArray());  
    dos.close(); 
    output.close(); 
} catch (Exception e) { 
} 

Quand je vérifie testProto .txt, j'ai vu le fichier a été écrit en tant que fichier texte, pas de fichier binaire, même si j'utilise toByteArray.

Quelqu'un pourrait-il aider?

Merci

Soit dit en passant, c'est le code pour lire ce fichier:

// Read from disk 
FileInputStream input = new FileInputStream("c:\\testProto.txt"); 
DataInputStream dis = new DataInputStream(input); 
profileBuild.mergeFrom(dis); 
dis.close(); 
input.close() 

Je suis capable de lire l'objet et obtenir la valeur très bien, mais simplement se demander si tel est le approche correcte à faire?

Répondre

2

Je ne sais pas pourquoi vous créez la DataOutputStream et appelant dos.write en premier lieu ...

Je normalement utiliser:

profile.build().writeTo(output); 

Cependant, je serais toujours attendu le fichier doit être un fichier binaire vraiment. Bien sûr, il inclurait le texte "123" et "John" car ce ne sont que des chaînes UTF-8 ... mais il aurait dû y avoir aussi du non-texte. Etes-vous sûr que c'est juste text? Pourriez-vous poster la sortie?

+0

Voici le ouput:! 123John # i0ad0290e000001296033cf0b540e7ae7 # i0ad0290e000001296033cf0b540e7ae8 # alhtough avant et après 123 (et John), il y a un certain caractère bizarre dans mon TextPad que je ne suis pas en mesure de copier ici. Je pense qu'il pourrait s'agir d'un caractère "tab" – user373307

+1

@workrelated: Je vous suggère de regarder le fichier dans un éditeur hexadécimal. Ce n'est pas parce qu'un fichier a un texte reconnaissable qu'il s'agit d'un fichier texte. Jetez un oeil à cela en conjonction avec la spécification de format pb. –

+0

Merci Jon. Je mets à jour la question ci-dessus avec mon exemple de code de lecture de ce fichier. Est-ce une bonne approche à faire? – user373307