Home | History | Annotate | only in /external/protobuf/java
Up to higher level directory
NameDateSize
pom.xml20-Sep-201311.5K
README.txt20-Sep-201310.5K
src/20-Sep-2013

README.txt

      1 Protocol Buffers - Google's data interchange format
      2 Copyright 2008 Google Inc.
      3 
      4 This directory contains the Java Protocol Buffers runtime library.
      5 
      6 Installation - With Maven
      7 =========================
      8 
      9 The Protocol Buffers build is managed using Maven.  If you would
     10 rather build without Maven, see below.
     11 
     12 1) Install Apache Maven if you don't have it:
     13 
     14      http://maven.apache.org/
     15 
     16 2) Build the C++ code, or obtain a binary distribution of protoc.  If
     17    you install a binary distribution, make sure that it is the same
     18    version as this package.  If in doubt, run:
     19 
     20      $ protoc --version
     21 
     22    You will need to place the protoc executable in ../src.  (If you
     23    built it yourself, it should already be there.)
     24 
     25 3) Run the tests:
     26 
     27      $ mvn test
     28 
     29    If some tests fail, this library may not work correctly on your
     30    system.  Continue at your own risk.
     31 
     32 4) Install the library into your Maven repository:
     33 
     34      $ mvn install
     35 
     36 5) If you do not use Maven to manage your own build, you can build a
     37    .jar file to use:
     38 
     39      $ mvn package
     40 
     41    The .jar will be placed in the "target" directory.
     42 
     43 Installation - 'Lite' Version - With Maven
     44 ==========================================
     45 
     46 Building the 'lite' version of the Java Protocol Buffers library is
     47 the same as building the full version, except that all commands are
     48 run using the 'lite' profile.  (see
     49 http://maven.apache.org/guides/introduction/introduction-to-profiles.html)
     50 
     51 E.g. to install the lite version of the jar, you would run:
     52 
     53   $ mvn install -P lite
     54 
     55 The resulting artifact has the 'lite' classifier.  To reference it
     56 for dependency resolution, you would specify it as:
     57 
     58   <dependency>
     59     <groupId>com.google.protobuf</groupId>
     60     <artifactId>protobuf-java</artifactId>
     61     <version>${version}</version>
     62     <classifier>lite</classifier>
     63   </dependency>
     64 
     65 Installation - Without Maven
     66 ============================
     67 
     68 If you would rather not install Maven to build the library, you may
     69 follow these instructions instead.  Note that these instructions skip
     70 running unit tests.
     71 
     72 1) Build the C++ code, or obtain a binary distribution of protoc.  If
     73    you install a binary distribution, make sure that it is the same
     74    version as this package.  If in doubt, run:
     75 
     76      $ protoc --version
     77 
     78    If you built the C++ code without installing, the compiler binary
     79    should be located in ../src.
     80 
     81 2) Invoke protoc to build DescriptorProtos.java:
     82 
     83      $ protoc --java_out=src/main/java -I../src \
     84          ../src/google/protobuf/descriptor.proto
     85 
     86 3) Compile the code in src/main/java using whatever means you prefer.
     87 
     88 4) Install the classes wherever you prefer.
     89 
     90 Micro version
     91 ============================
     92 
     93 The runtime and generated code for MICRO_RUNTIME is smaller
     94 because it does not include support for the descriptor,
     95 reflection or extensions. Also, not currently supported
     96 are packed repeated elements nor testing of java_multiple_files.
     97 
     98 To create a jar file for the runtime and run tests invoke
     99 "mvn package -P micro" from the <protobuf-root>/java
    100 directory. The generated jar file is
    101 <protobuf-root>java/target/protobuf-java-2.2.0-micro.jar.
    102 
    103 If you wish to compile the MICRO_RUTIME your self, place
    104 the 7 files below, in <root>/com/google/protobuf and
    105 create a jar file for use with your code and the generated
    106 code:
    107 
    108 ByteStringMicro.java
    109 CodedInputStreamMicro.java
    110 CodedOutputStreamMicro.java
    111 InvalidProtocolBufferException.java
    112 MessageMicro.java
    113 WireFormatMicro.java
    114 
    115 If you wish to change on the code generator it is located
    116 in /src/google/protobuf/compiler/javamicro.
    117 
    118 To generate code for the MICRO_RUNTIME invoke protoc with
    119 --javamicro_out command line parameter. javamciro_out takes
    120 a series of optional sub-parameters separated by comma's
    121 and a final parameter, with a colon separator, which defines
    122 the source directory. Sub-paraemeters begin with a name
    123 followed by an equal and if that sub-parameter has multiple
    124 parameters they are seperated by "|". The command line options
    125 are:
    126 
    127 opt                  -> speed or space
    128 java_use_vector      -> true or false
    129 java_package         -> <file-name>|<package-name>
    130 java_outer_classname -> <file-name>|<package-name>
    131 
    132 opt:
    133   This change the code generation to optimize for speed,
    134   opt=speed, or space, opt=space. When opt=speed this
    135   changes the code generation for strings so that multiple
    136   conversions to Utf8 are eliminated. The default value
    137   is opt=space.
    138 
    139 java_use_vector:
    140   Is a boolean flag either java_use_vector=true or
    141   java_use_vector=false. When java_use_vector=true the
    142   code generated for repeated elements uses
    143   java.util.Vector and when java_use_vector=false the
    144   java.util.ArrayList<> is used. When java.util.Vector
    145   is used the code must be compiled with Java 1.3 and
    146   when ArrayList is used Java 1.5 or above must be used.
    147   The using javac the source parameter maybe used to
    148   control the version of the srouce: "javac -source 1.3".
    149   You can also change the <source> xml element for the
    150   maven-compiler-plugin. Below is for 1.5 sources:
    151 
    152       <plugin>
    153         <artifactId>maven-compiler-plugin</artifactId>
    154         <configuration>
    155           <source>1.5</source>
    156           <target>1.5</target>
    157         </configuration>
    158       </plugin>
    159 
    160   When compiling for 1.5 java_use_vector=false or not
    161   present where the default value is false.
    162 
    163   And below would be for 1.3 sources note when changing
    164   to 1.3 you must also set java_use_vector=true:
    165 
    166       <plugin>
    167         <artifactId>maven-compiler-plugin</artifactId>
    168         <configuration>
    169           <source>1.3</source>
    170           <target>1.5</target>
    171         </configuration>
    172       </plugin>
    173 
    174 java_package:
    175   The allows setting/overriding the java_package option
    176   and associates allows a package name for a file to
    177   be specified on the command line. Overriding any
    178   "option java_package xxxx" in the file. The default
    179   if not present is to use the value from the package
    180   statment or "option java_package xxxx" in the file.
    181 
    182 java_outer_classname:
    183   This allows the setting/overriding of the outer
    184   class name option and associates a class name
    185   to a file. An outer class name is required and
    186   must be specified if there are multiple messages
    187   in a single proto file either in the proto source
    188   file or on the command line. If not present the
    189   no outer class name will be used.
    190 
    191 Below are a series of examples for clarification of the
    192 various javamicro_out parameters using
    193 src/test/proto/simple-data.proto:
    194 
    195 package testprotobuf;
    196 
    197 message SimpleData {
    198   optional fixed64 id = 1;
    199   optional string description = 2;
    200   optional bool ok = 3 [default = false];
    201 };
    202 
    203 
    204 Assuming you've only compiled and not installed protoc and
    205 your current working directory java/, then a simple
    206 command line to compile simple-data would be:
    207 
    208 ../src/protoc --javamicro_out=. src/test/proto/simple-data.proto
    209 
    210 This will create testprotobuf/SimpleData.java
    211 
    212 The directory testprotobuf is created because on line 1
    213 of simple-data.proto is "package testprotobuf;". If you
    214 wanted a different package name you could use the
    215 java_package option command line sub-parameter:
    216 
    217 ../src/protoc '--javamicro_out=java_package=src/test/proto/simple-data.proto|my_package:.' src/test/proto/simple-data.proto
    218 
    219 Here you see the new java_package sub-parameter which
    220 itself needs two parameters the file name and the
    221 package name, these are separated by "|". Now you'll
    222 find my_package/SimpleData.java.
    223 
    224 If you wanted to also change the optimization for
    225 speed you'd add opt=speed with the comma seperator
    226 as follows:
    227 
    228 ../src/protoc '--javamicro_out=opt=speed,java_package=src/test/proto/simple-data.proto|my_package:.' src/test/proto/simple-data.proto
    229 
    230 Finally if you also wanted an outer class name you'd
    231 do the following:
    232 
    233 ../src/protoc '--javamicro_out=opt=speed,java_package=src/test/proto/simple-data.proto|my_package,java_outer_classname=src/test/proto/simple-data.proto|OuterName:.' src/test/proto/simple-data.proto
    234 
    235 Now you'll find my_packate/OuterName.java.
    236 
    237 As mentioned java_package and java_outer_classname
    238 may also be specified in the file. In the example
    239 below we must define java_outer_classname because
    240 there are multiple messages in
    241 src/test/proto/two-messages.proto
    242 
    243 package testmicroruntime;
    244 
    245 option java_package = "com.example";
    246 option java_outer_classname = "TestMessages";
    247 
    248 message TestMessage1 {
    249   required int32 id = 1;
    250 }
    251 
    252 message TestMessage2 {
    253   required int32 id = 1;
    254 }
    255 
    256 This could be compiled using:
    257 
    258 ../src/protoc --javamicro_out=. src/test/proto/two-message.proto
    259 
    260 With the result will be com/example/TestMessages.java
    261 
    262 
    263 Nano version
    264 ============================
    265 
    266 Nano is even smaller than micro, especially in the number of generated
    267 functions. It is like micro except:
    268 
    269 - No setter/getter/hazzer functions.
    270 - Has state is not available. Outputs all fields not equal to their
    271   default. (See important implications below.)
    272 - CodedInputStreamMicro is renamed to CodedInputByteBufferNano and can
    273   only take byte[] (not InputStream).
    274 - Similar rename from CodedOutputStreamMicro to
    275   CodedOutputByteBufferNano.
    276 - Repeated fields are in arrays, not ArrayList or Vector.
    277 - Unset messages/groups are null, not an immutable empty default
    278   instance.
    279 - Required fields are always serialized.
    280 - toByteArray(...) and mergeFrom(...) are now static functions of
    281   MessageNano.
    282 - "bytes" are of java type byte[].
    283 
    284 IMPORTANT: If you have fields with defaults
    285 
    286 How fields with defaults are serialized has changed. Because we don't
    287 keep "has" state, any field equal to its default is assumed to be not
    288 set and therefore is not serialized. Consider the situation where we
    289 change the default value of a field. Senders compiled against an older
    290 version of the proto continue to match against the old default, and
    291 don't send values to the receiver even though the receiver assumes the
    292 new default value. Therefore, think carefully about the implications
    293 of changing the default value.
    294 
    295 IMPORTANT: If you have "bytes" fields with non-empty defaults
    296 
    297 Because the byte buffer is now of mutable type byte[], the default
    298 static final cannot be exposed through a public field. Each time a
    299 message's constructor or clear() function is called, the default value
    300 (kept in a private byte[]) is cloned. This causes a small memory
    301 penalty. This is not a problem if the field has no default or is an
    302 empty default.
    303 
    304 
    305 To use nano protobufs:
    306 
    307 - Link with the generated jar file
    308   <protobuf-root>java/target/protobuf-java-2.3.0-nano.jar.
    309 - Invoke with --javanano_out, e.g.:
    310 
    311 ../src/protoc '--javanano_out=java_package=src/test/proto/simple-data.proto|my_package,java_outer_classname=src/test/proto/simple-data.proto|OuterName:.' src/test/proto/simple-data.proto
    312 
    313 
    314 Usage
    315 =====
    316 
    317 The complete documentation for Protocol Buffers is available via the
    318 web at:
    319 
    320   http://code.google.com/apis/protocolbuffers/
    321