OLD | NEW |
(Empty) | |
| 1 Protocol Buffers - Google's data interchange format |
| 2 =================================================== |
| 3 |
| 4 [![Build Status](https://travis-ci.org/google/protobuf.svg?branch=master)](https
://travis-ci.org/google/protobuf) |
| 5 |
| 6 Copyright 2008 Google Inc. |
| 7 |
| 8 This directory contains the Java Protocol Buffers Nano runtime library. |
| 9 |
| 10 Installation - With Maven |
| 11 ------------------------- |
| 12 |
| 13 The Protocol Buffers build is managed using Maven. If you would |
| 14 rather build without Maven, see below. |
| 15 |
| 16 1) Install Apache Maven if you don't have it: |
| 17 |
| 18 http://maven.apache.org/ |
| 19 |
| 20 2) Build the C++ code, or obtain a binary distribution of protoc. If |
| 21 you install a binary distribution, make sure that it is the same |
| 22 version as this package. If in doubt, run: |
| 23 |
| 24 $ protoc --version |
| 25 |
| 26 You will need to place the protoc executable in ../src. (If you |
| 27 built it yourself, it should already be there.) |
| 28 |
| 29 3) Run the tests: |
| 30 |
| 31 $ mvn test |
| 32 |
| 33 If some tests fail, this library may not work correctly on your |
| 34 system. Continue at your own risk. |
| 35 |
| 36 4) Install the library into your Maven repository: |
| 37 |
| 38 $ mvn install |
| 39 |
| 40 5) If you do not use Maven to manage your own build, you can build a |
| 41 .jar file to use: |
| 42 |
| 43 $ mvn package |
| 44 |
| 45 The .jar will be placed in the "target" directory. |
| 46 |
| 47 Installation - Without Maven |
| 48 ---------------------------- |
| 49 |
| 50 If you would rather not install Maven to build the library, you may |
| 51 follow these instructions instead. Note that these instructions skip |
| 52 running unit tests. |
| 53 |
| 54 1) Build the C++ code, or obtain a binary distribution of protoc. If |
| 55 you install a binary distribution, make sure that it is the same |
| 56 version as this package. If in doubt, run: |
| 57 |
| 58 $ protoc --version |
| 59 |
| 60 If you built the C++ code without installing, the compiler binary |
| 61 should be located in ../src. |
| 62 |
| 63 2) Invoke protoc to build DescriptorProtos.java: |
| 64 |
| 65 $ protoc --java_out=src/main/java -I../src \ |
| 66 ../src/google/protobuf/descriptor.proto |
| 67 |
| 68 3) Compile the code in src/main/java using whatever means you prefer. |
| 69 |
| 70 4) Install the classes wherever you prefer. |
| 71 |
| 72 Nano version |
| 73 ------------ |
| 74 |
| 75 JavaNano is a special code generator and runtime library designed specially for |
| 76 resource-restricted systems, like Android. It is very resource-friendly in both |
| 77 the amount of code and the runtime overhead. Here is an overview of JavaNano |
| 78 features compared with the official Java protobuf: |
| 79 |
| 80 - No descriptors or message builders. |
| 81 - All messages are mutable; fields are public Java fields. |
| 82 - For optional fields only, encapsulation behind setter/getter/hazzer/ |
| 83 clearer functions is opt-in, which provide proper 'has' state support. |
| 84 - For proto2, if not opted in, has state (field presence) is not available. |
| 85 Serialization outputs all fields not equal to their defaults |
| 86 (see important implications below). |
| 87 The behavior is consistent with proto3 semantics. |
| 88 - Required fields (proto2 only) are always serialized. |
| 89 - Enum constants are integers; protection against invalid values only |
| 90 when parsing from the wire. |
| 91 - Enum constants can be generated into container interfaces bearing |
| 92 the enum's name (so the referencing code is in Java style). |
| 93 - CodedInputByteBufferNano can only take byte[] (not InputStream). |
| 94 - Similarly CodedOutputByteBufferNano can only write to byte[]. |
| 95 - Repeated fields are in arrays, not ArrayList or Vector. Null array |
| 96 elements are allowed and silently ignored. |
| 97 - Full support for serializing/deserializing repeated packed fields. |
| 98 - Support extensions (in proto2). |
| 99 - Unset messages/groups are null, not an immutable empty default |
| 100 instance. |
| 101 - toByteArray(...) and mergeFrom(...) are now static functions of |
| 102 MessageNano. |
| 103 - The 'bytes' type translates to the Java type byte[]. |
| 104 |
| 105 The generated messages are not thread-safe for writes, but may be |
| 106 used simultaneously from multiple threads in a read-only manner. |
| 107 In other words, an appropriate synchronization mechanism (such as |
| 108 a ReadWriteLock) must be used to ensure that a message, its |
| 109 ancestors, and descendants are not accessed by any other threads |
| 110 while the message is being modified. Field reads, getter methods |
| 111 (but not getExtension(...)), toByteArray(...), writeTo(...), |
| 112 getCachedSize(), and getSerializedSize() are all considered read-only |
| 113 operations. |
| 114 |
| 115 IMPORTANT: If you have fields with defaults and opt out of accessors |
| 116 |
| 117 How fields with defaults are serialized has changed. Because we don't |
| 118 keep "has" state, any field equal to its default is assumed to be not |
| 119 set and therefore is not serialized. Consider the situation where we |
| 120 change the default value of a field. Senders compiled against an older |
| 121 version of the proto continue to match against the old default, and |
| 122 don't send values to the receiver even though the receiver assumes the |
| 123 new default value. Therefore, think carefully about the implications |
| 124 of changing the default value. Alternatively, turn on accessors and |
| 125 enjoy the benefit of the explicit has() checks. |
| 126 |
| 127 IMPORTANT: If you have "bytes" fields with non-empty defaults |
| 128 |
| 129 Because the byte buffer is now of mutable type byte[], the default |
| 130 static final cannot be exposed through a public field. Each time a |
| 131 message's constructor or clear() function is called, the default value |
| 132 (kept in a private byte[]) is cloned. This causes a small memory |
| 133 penalty. This is not a problem if the field has no default or is an |
| 134 empty default. |
| 135 |
| 136 Nano Generator options |
| 137 ---------------------- |
| 138 |
| 139 ``` |
| 140 java_package -> <file-name>|<package-name> |
| 141 java_outer_classname -> <file-name>|<package-name> |
| 142 java_multiple_files -> true or false |
| 143 java_nano_generate_has -> true or false [DEPRECATED] |
| 144 optional_field_style -> default or accessors |
| 145 enum_style -> c or java |
| 146 ignore_services -> true or false |
| 147 parcelable_messages -> true or false |
| 148 generate_intdefs -> true or false |
| 149 ``` |
| 150 |
| 151 **java_package=\<file-name\>|\<package-name\>** (no default) |
| 152 |
| 153 This allows overriding the 'java_package' option value |
| 154 for the given file from the command line. Use multiple |
| 155 java_package options to override the option for multiple |
| 156 files. The final Java package for each file is the value |
| 157 of this command line option if present, or the value of |
| 158 the same option defined in the file if present, or the |
| 159 proto package if present, or the default Java package. |
| 160 |
| 161 **java_outer_classname=\<file-name\>|\<outer-classname\>** (no default) |
| 162 |
| 163 This allows overriding the 'java_outer_classname' option |
| 164 for the given file from the command line. Use multiple |
| 165 java_outer_classname options to override the option for |
| 166 multiple files. The final Java outer class name for each |
| 167 file is the value of this command line option if present, |
| 168 or the value of the same option defined in the file if |
| 169 present, or the file name converted to CamelCase. This |
| 170 outer class will nest all classes and integer constants |
| 171 generated from file-scope messages and enums. |
| 172 |
| 173 **java_multiple_files={true,false}** (no default) |
| 174 |
| 175 This allows overriding the 'java_multiple_files' option |
| 176 in all source files and their imported files from the |
| 177 command line. The final value of this option for each |
| 178 file is the value defined in this command line option, or |
| 179 the value of the same option defined in the file if |
| 180 present, or false. This specifies whether to generate |
| 181 package-level classes for the file-scope messages in the |
| 182 same Java package as the outer class (instead of nested |
| 183 classes in the outer class). File-scope enum constants |
| 184 are still generated as integer constants in the outer |
| 185 class. This affects the fully qualified references in the |
| 186 Java code. NOTE: because the command line option |
| 187 overrides the value for all files and their imported |
| 188 files, using this option inconsistently may result in |
| 189 incorrect references to the imported messages and enum |
| 190 constants. |
| 191 |
| 192 **java_nano_generate_has={true,false}** (default: false) |
| 193 |
| 194 DEPRECATED. Use optional_field_style=accessors. |
| 195 |
| 196 If true, generates a public boolean variable has\<fieldname\> |
| 197 accompanying each optional or required field (not present for |
| 198 repeated fields, groups or messages). It is set to false initially |
| 199 and upon clear(). If parseFrom(...) reads the field from the wire, |
| 200 it is set to true. This is a way for clients to inspect the "has" |
| 201 value upon parse. If it is set to true, writeTo(...) will ALWAYS |
| 202 output that field (even if field value is equal to its |
| 203 default). |
| 204 |
| 205 IMPORTANT: This option costs an extra 4 bytes per primitive field in |
| 206 the message. Think carefully about whether you really need this. In |
| 207 many cases reading the default works and determining whether the |
| 208 field was received over the wire is irrelevant. |
| 209 |
| 210 **optional_field_style={default,accessors,reftypes}** (default: default) |
| 211 |
| 212 Defines the style of the generated code for fields. |
| 213 |
| 214 * default |
| 215 |
| 216 In the default style, optional fields translate into public mutable |
| 217 Java fields, and the serialization process is as discussed in the |
| 218 "IMPORTANT" section above. |
| 219 |
| 220 * accessors |
| 221 |
| 222 When set to 'accessors', each optional field is encapsulated behind |
| 223 4 accessors, namely get\<fieldname\>(), set\<fieldname\>(), has\<fieldname\>() |
| 224 and clear\<fieldname\>() methods, with the standard semantics. The hazzer's |
| 225 return value determines whether a field is serialized, so this style is |
| 226 useful when you need to serialize a field with the default value, or check |
| 227 if a field has been explicitly set to its default value from the wire. |
| 228 |
| 229 In the 'accessors' style, required and nested message fields are still |
| 230 translated to one public mutable Java field each, repeated fields are still |
| 231 translated to arrays. No accessors are generated for them. |
| 232 |
| 233 IMPORTANT: When using the 'accessors' style, ProGuard should always |
| 234 be enabled with optimization (don't use -dontoptimize) and allowing |
| 235 access modification (use -allowaccessmodification). This removes the |
| 236 unused accessors and maybe inline the rest at the call sites, |
| 237 reducing the final code size. |
| 238 TODO(maxtroy): find ProGuard config that would work the best. |
| 239 |
| 240 * reftypes |
| 241 |
| 242 When set to 'reftypes', each proto field is generated as a public Java |
| 243 field. For primitive types, these fields use the Java reference types |
| 244 such as java.lang.Integer instead of primitive types such as int. |
| 245 |
| 246 In the 'reftypes' style, fields are initialized to null (or empty |
| 247 arrays for repeated fields), and their default values are not available. |
| 248 They are serialized over the wire based on equality to null. |
| 249 |
| 250 The 'reftypes' mode has some additional cost due to autoboxing and usage |
| 251 of reference types. In practice, many boxed types are cached, and so don't |
| 252 result in object creation. However, references do take slightly more memory |
| 253 than primitives. |
| 254 |
| 255 The 'reftypes' mode is useful when you want to be able to serialize fields |
| 256 with default values, or check if a field has been explicitly set to the |
| 257 default over the wire without paying the extra method cost of the |
| 258 'accessors' mode. |
| 259 |
| 260 Note that if you attempt to write null to a required field in the reftypes |
| 261 mode, serialization of the proto will cause a NullPointerException. This is |
| 262 an intentional indicator that you must set required fields. |
| 263 |
| 264 NOTE |
| 265 optional_field_style=accessors or reftypes cannot be used together with |
| 266 java_nano_generate_has=true. If you need the 'has' flag for any |
| 267 required field (you have no reason to), you can only use |
| 268 java_nano_generate_has=true. |
| 269 |
| 270 **enum_style={c,java}** (default: c) |
| 271 |
| 272 Defines where to put the int constants generated from enum members. |
| 273 |
| 274 * c |
| 275 |
| 276 Use C-style, so the enum constants are available at the scope where |
| 277 the enum is defined. A file-scope enum's members are referenced like |
| 278 'FileOuterClass.ENUM_VALUE'; a message-scope enum's members are |
| 279 referenced as 'Message.ENUM_VALUE'. The enum name is unavailable. |
| 280 This complies with the Micro code generator's behavior. |
| 281 |
| 282 * java |
| 283 |
| 284 Use Java-style, so the enum constants are available under the enum |
| 285 name and referenced like 'EnumName.ENUM_VALUE' (they are still int |
| 286 constants). The enum name becomes the name of a public interface, at |
| 287 the scope where the enum is defined. If the enum is file-scope and |
| 288 the java_multiple_files option is on, the interface will be defined |
| 289 in its own file. To reduce code size, this interface should not be |
| 290 implemented and ProGuard shrinking should be used, so after the Java |
| 291 compiler inlines all referenced enum constants into the call sites, |
| 292 the interface remains unused and can be removed by ProGuard. |
| 293 |
| 294 **ignore_services={true,false}** (default: false) |
| 295 |
| 296 Skips services definitions. |
| 297 |
| 298 Nano doesn't support services. By default, if a service is defined |
| 299 it will generate a compilation error. If this flag is set to true, |
| 300 services will be silently ignored, instead. |
| 301 |
| 302 **parcelable_messages={true,false}** (default: false) |
| 303 |
| 304 Android-specific option to generate Parcelable messages. |
| 305 |
| 306 **generate_intdefs={true,false}** (default: false) |
| 307 Android-specific option to generate @IntDef annotations for enums. |
| 308 |
| 309 If turned on, an '@IntDef' annotation (a public @interface) will be |
| 310 generated for each enum, and every integer parameter and return |
| 311 value in the generated code meant for this enum will be annotated |
| 312 with it. This interface is generated with the same name and at the |
| 313 same place as the enum members' container interfaces described |
| 314 above under 'enum_style=java', regardless of the enum_style option |
| 315 used. When this is combined with enum_style=java, the interface |
| 316 will be both the '@IntDef' annotation and the container of the enum |
| 317 members; otherwise the interface has an empty body. |
| 318 |
| 319 Your app must declare a compile-time dependency on the |
| 320 android-support-annotations library. |
| 321 |
| 322 For more information on how these @IntDef annotations help with |
| 323 compile-time type safety, see: |
| 324 https://sites.google.com/a/android.com/tools/tech-docs/support-annotations |
| 325 and |
| 326 https://developer.android.com/reference/android/support/annotation/IntDef.html |
| 327 |
| 328 |
| 329 To use nano protobufs within the Android repo: |
| 330 ---------------------------------------------- |
| 331 |
| 332 - Set 'LOCAL_PROTOC_OPTIMIZE_TYPE := nano' in your local .mk file. |
| 333 When building a Java library or an app (package) target, the build |
| 334 system will add the Java nano runtime library to the |
| 335 LOCAL_STATIC_JAVA_LIBRARIES variable, so you don't need to. |
| 336 - Set 'LOCAL_PROTO_JAVA_OUTPUT_PARAMS := ...' in your local .mk file |
| 337 for any command-line options you need. Use commas to join multiple |
| 338 options. In the nano flavor only, whitespace surrounding the option |
| 339 names and values are ignored, so you can use backslash-newline or |
| 340 '+=' to structure your make files nicely. |
| 341 - The options will be applied to *all* proto files in LOCAL_SRC_FILES |
| 342 when you build a Java library or package. In case different options |
| 343 are needed for different proto files, build separate Java libraries |
| 344 and reference them in your main target. Note: you should make sure |
| 345 that, for each separate target, all proto files imported from any |
| 346 proto file in LOCAL_SRC_FILES are included in LOCAL_SRC_FILES. This |
| 347 is because the generator has to assume that the imported files are |
| 348 built using the same options, and will generate code that reference |
| 349 the fields and enums from the imported files using the same code |
| 350 style. |
| 351 - Hint: 'include $(CLEAR_VARS)' resets all LOCAL_ variables, including |
| 352 the two above. |
| 353 |
| 354 To use nano protobufs outside of Android repo: |
| 355 ---------------------------------------------- |
| 356 |
| 357 - Link with the generated jar file |
| 358 \<protobuf-root\>java/target/protobuf-java-2.3.0-nano.jar. |
| 359 - Invoke with --javanano_out, e.g.: |
| 360 ``` |
| 361 ./protoc '--javanano_out=\ |
| 362 java_package=src/proto/simple-data.proto|my_package,\ |
| 363 java_outer_classname=src/proto/simple-data.proto|OuterName\ |
| 364 :.' src/proto/simple-data.proto |
| 365 ``` |
| 366 |
| 367 Contributing to nano: |
| 368 --------------------- |
| 369 |
| 370 Please add/edit tests in NanoTest.java. |
| 371 |
| 372 Please run the following steps to test: |
| 373 |
| 374 - cd external/protobuf |
| 375 - ./configure |
| 376 - Run "make -j12 check" and verify all tests pass. |
| 377 - cd java |
| 378 - Run "mvn test" and verify all tests pass. |
| 379 - cd ../../.. |
| 380 - . build/envsetup.sh |
| 381 - lunch 1 |
| 382 - "make -j12 aprotoc libprotobuf-java-2.3.0-nano aprotoc-test-nano-params NanoAn
droidTest" and |
| 383 check for build errors. |
| 384 - Plug in an Android device or start an emulator. |
| 385 - adb install -r out/target/product/generic/data/app/NanoAndroidTest.apk |
| 386 - Run: |
| 387 "adb shell am instrument -w com.google.protobuf.nano.test/android.test.Instrum
entationTestRunner" |
| 388 and verify all tests pass. |
| 389 - repo sync -c -j256 |
| 390 - "make -j12" and check for build errors |
| 391 |
| 392 Usage |
| 393 ----- |
| 394 |
| 395 The complete documentation for Protocol Buffers is available via the |
| 396 web at: |
| 397 |
| 398 https://developers.google.com/protocol-buffers/ |
OLD | NEW |