下面列出了怎么用com.google.protobuf.nano.MessageNano的API类实例代码及写法,或者点击链接到github查看源代码。
@Override
protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List<Object> out)
throws Exception {
final byte[] array;
final int offset;
final int length = msg.readableBytes();
if (msg.hasArray()) {
array = msg.array();
offset = msg.arrayOffset() + msg.readerIndex();
} else {
array = new byte[length];
msg.getBytes(msg.readerIndex(), array, 0, length);
offset = 0;
}
MessageNano prototype = clazz.getConstructor().newInstance();
out.add(MessageNano.mergeFrom(prototype, array, offset, length));
}
/**
* Deserialize a proto after verifying checksum wrapper.
*/
private <T extends MessageNano> T unpackProto(T proto, byte[] buffer, int dataSize)
throws InvalidProtocolBufferNanoException {
MessageNano.mergeFrom(proto, readCheckedBytes(buffer, dataSize));
if (DEBUG) Log.d(TAG, "unpacked proto " + proto);
return proto;
}
@Test
public void testRoundTrip() {
Message m = new Message();
m.i = 2;
m.b = true;
m.s = "string";
Message m2 = marshaller.parse(marshaller.stream(m));
assertNotSame(m, m2);
assertEquals(2, m2.i);
assertEquals(true, m2.b);
assertEquals("string", m2.s);
assertTrue(MessageNano.messageNanoEquals(m, m2));
}
@Override
protected void encode(
ChannelHandlerContext ctx, MessageNano msg, List<Object> out) throws Exception {
final int size = msg.getSerializedSize();
final ByteBuf buffer = ctx.alloc().heapBuffer(size, size);
final byte[] array = buffer.array();
CodedOutputByteBufferNano cobbn = CodedOutputByteBufferNano.newInstance(array,
buffer.arrayOffset(), buffer.capacity());
msg.writeTo(cobbn);
buffer.writerIndex(size);
out.add(buffer);
}
/**
* Update tab entries based on metadata.
* @param metadataBytes Metadata from last time Chrome was alive.
* @param entryMap Map to fill with {@link DocumentTabModel.Entry}s about Tabs.
* @param recentlyClosedTabIdList List to fill with IDs of recently closed tabs.
*/
private void updateTabEntriesFromMetadata(byte[] metadataBytes, SparseArray<Entry> entryMap,
List<Integer> recentlyClosedTabIdList) {
if (metadataBytes != null) {
DocumentList list = null;
try {
list = MessageNano.mergeFrom(new DocumentList(), metadataBytes);
} catch (IOException e) {
Log.e(TAG, "I/O exception", e);
}
if (list == null) return;
for (int i = 0; i < list.entries.length; i++) {
DocumentEntry savedEntry = list.entries[i];
int tabId = savedEntry.tabId;
// If the tab ID isn't in the list, it must have been closed after Chrome died.
if (entryMap.indexOfKey(tabId) < 0) {
recentlyClosedTabIdList.add(tabId);
continue;
}
// Restore information about the Tab.
entryMap.get(tabId).canGoBack = savedEntry.canGoBack;
}
}
}
/**
* Update tab entries based on metadata.
* @param metadataBytes Metadata from last time Chrome was alive.
* @param entryMap Map to fill with {@link DocumentTabModel.Entry}s about Tabs.
* @param recentlyClosedTabIdList List to fill with IDs of recently closed tabs.
*/
private void updateTabEntriesFromMetadata(byte[] metadataBytes, SparseArray<Entry> entryMap,
List<Integer> recentlyClosedTabIdList) {
if (metadataBytes != null) {
DocumentList list = null;
try {
list = MessageNano.mergeFrom(new DocumentList(), metadataBytes);
} catch (IOException e) {
Log.e(TAG, "I/O exception", e);
}
if (list == null) return;
for (int i = 0; i < list.entries.length; i++) {
DocumentEntry savedEntry = list.entries[i];
int tabId = savedEntry.tabId;
// If the tab ID isn't in the list, it must have been closed after Chrome died.
if (entryMap.indexOfKey(tabId) < 0) {
recentlyClosedTabIdList.add(tabId);
continue;
}
// Restore information about the Tab.
entryMap.get(tabId).canGoBack = savedEntry.canGoBack;
}
}
}
/**
* Deserialize a proto after verifying checksum wrapper.
*/
private <T extends MessageNano> T unpackProto(T proto, byte[] buffer, int dataSize)
throws InvalidProtocolBufferNanoException {
MessageNano.mergeFrom(proto, readCheckedBytes(buffer, dataSize));
if (DEBUG) Log.d(TAG, "unpacked proto " + proto);
return proto;
}
private void writeRowToBackup(String backupKey, MessageNano proto,
BackupDataOutput data) throws IOException {
byte[] blob = writeCheckedBytes(proto);
data.writeEntityHeader(backupKey, blob.length);
data.writeEntityData(blob, blob.length);
mBackupDataWasUpdated = true;
if (VERBOSE) Log.v(TAG, "Writing New entry " + backupKey);
}
/** Wrap a proto in a CheckedMessage and compute the checksum. */
private byte[] writeCheckedBytes(MessageNano proto) {
CheckedMessage wrapper = new CheckedMessage();
wrapper.payload = MessageNano.toByteArray(proto);
CRC32 checksum = new CRC32();
checksum.update(wrapper.payload);
wrapper.checksum = checksum.getValue();
return MessageNano.toByteArray(wrapper);
}
/** Unwrap a proto message from a CheckedMessage, verifying the checksum. */
private static byte[] readCheckedBytes(byte[] buffer, int dataSize)
throws InvalidProtocolBufferNanoException {
CheckedMessage wrapper = new CheckedMessage();
MessageNano.mergeFrom(wrapper, buffer, 0, dataSize);
CRC32 checksum = new CRC32();
checksum.update(wrapper.payload);
if (wrapper.checksum != checksum.getValue()) {
throw new InvalidProtocolBufferNanoException("checksum does not match");
}
return wrapper.payload;
}
public static void writeToFile(@NonNull final Context context,
@NonNull final String fileName,
@NonNull final MessageNano messageNano) {
final byte[] output;
try {
output = toByteArray(messageNano);
} catch (IOException e) {
Log.w(TAG, e);
return;
}
FileUtils.writeOrDeletePrivateFile(context, fileName, output);
}
@Nullable
public static <T extends MessageNano> T readFromFile(@NonNull final Context context,
@NonNull final String fileName,
@NonNull final T obj) {
T message = null;
try {
final byte[] bytes = FileUtils.readPrivateFile(context, fileName);
message = MessageNano.mergeFrom(obj, bytes);
} catch (IOException e) {
Log.w(TAG, e);
}
return message;
}
@NonNull
public static <T extends MessageNano> T readFromFileNonNull(@NonNull final Context context,
@NonNull final String fileName,
@NonNull final T obj) {
final T message = readFromFile(context, fileName, obj);
return message != null ? message : obj;
}
@Test
public void testToByteArray() throws Exception {
final SettingsProto.Settings message = new SettingsProto.Settings();
message.scrobbleEnabled = true;
message.theme = 666;
final byte[] data = ProtoUtils.toByteArray(message);
assertNotNull(data);
final SettingsProto.Settings fromBytes = MessageNano.mergeFrom(
new SettingsProto.Settings(), data);
assertEquals(message.scrobbleEnabled, fromBytes.scrobbleEnabled);
assertEquals(message.theme, fromBytes.theme);
}
/** Deserialize a Screen from persistence, after verifying checksum wrapper. */
private ContentValues unpackScreen(byte[] buffer, int offset, int dataSize)
throws InvalidProtocolBufferNanoException {
Screen screen = new Screen();
MessageNano.mergeFrom(screen, readCheckedBytes(buffer, offset, dataSize));
if (VERBOSE) Log.v(TAG, "unpacked screen " + screen.id + "/" + screen.rank);
ContentValues values = new ContentValues();
values.put(WorkspaceScreens._ID, screen.id);
values.put(WorkspaceScreens.SCREEN_RANK, screen.rank);
return values;
}
/** Deserialize an icon resource from persistence, after verifying checksum wrapper. */
private static Resource unpackIcon(byte[] buffer, int offset, int dataSize)
throws InvalidProtocolBufferNanoException {
Resource res = new Resource();
MessageNano.mergeFrom(res, readCheckedBytes(buffer, offset, dataSize));
if (VERBOSE) Log.v(TAG, "unpacked icon " + res.dpi + "/" + res.data.length);
return res;
}
/** Deserialize a widget from persistence, after verifying checksum wrapper. */
private Widget unpackWidget(byte[] buffer, int offset, int dataSize)
throws InvalidProtocolBufferNanoException {
Widget widget = new Widget();
MessageNano.mergeFrom(widget, readCheckedBytes(buffer, offset, dataSize));
if (VERBOSE) Log.v(TAG, "unpacked widget " + widget.provider);
return widget;
}
/** Wrap a proto in a CheckedMessage and compute the checksum. */
private byte[] writeCheckedBytes(MessageNano proto) {
CheckedMessage wrapper = new CheckedMessage();
wrapper.payload = MessageNano.toByteArray(proto);
CRC32 checksum = new CRC32();
checksum.update(wrapper.payload);
wrapper.checksum = checksum.getValue();
return MessageNano.toByteArray(wrapper);
}
/** Unwrap a proto message from a CheckedMessage, verifying the checksum. */
private static byte[] readCheckedBytes(byte[] buffer, int offset, int dataSize)
throws InvalidProtocolBufferNanoException {
CheckedMessage wrapper = new CheckedMessage();
MessageNano.mergeFrom(wrapper, buffer, offset, dataSize);
CRC32 checksum = new CRC32();
checksum.update(wrapper.payload);
if (wrapper.checksum != checksum.getValue()) {
throw new InvalidProtocolBufferNanoException("checksum does not match");
}
return wrapper.payload;
}
/** Unwrap a proto message from a CheckedMessage, verifying the checksum. */
private static byte[] readCheckedBytes(byte[] buffer, int dataSize)
throws InvalidProtocolBufferNanoException {
CheckedMessage wrapper = new CheckedMessage();
MessageNano.mergeFrom(wrapper, buffer, 0, dataSize);
CRC32 checksum = new CRC32();
checksum.update(wrapper.payload);
if (wrapper.checksum != checksum.getValue()) {
throw new InvalidProtocolBufferNanoException("checksum does not match");
}
return wrapper.payload;
}
/** Wrap a proto in a CheckedMessage and compute the checksum. */
private byte[] writeCheckedBytes(MessageNano proto) {
CheckedMessage wrapper = new CheckedMessage();
wrapper.payload = MessageNano.toByteArray(proto);
CRC32 checksum = new CRC32();
checksum.update(wrapper.payload);
wrapper.checksum = checksum.getValue();
return MessageNano.toByteArray(wrapper);
}
NanoProtoInputStream(MessageNano message) {
this.message = message;
}
/**
* Creates a new instance.
*/
public ProtobufDecoderNano(Class<? extends MessageNano> clazz) {
this.clazz = ObjectUtil.checkNotNull(clazz, "You must provide a Class");
}
public byte[] toProtoBytes() {
return MessageNano.toByteArray(mProto);
}
private void writeRowToBackup(Key key, MessageNano proto, BackupDataOutput data)
throws IOException {
writeRowToBackup(keyToBackupKey(key), proto, data);
}
@NonNull
public static byte[] toByteArray(@NonNull final MessageNano messageNano) throws IOException {
final byte[] output = new byte[messageNano.getSerializedSize()];
messageNano.writeTo(CodedOutputByteBufferNano.newInstance(output));
return output;
}
/** Deserialize a Favorite from persistence, after verifying checksum wrapper. */
private ContentValues unpackFavorite(byte[] buffer, int offset, int dataSize)
throws InvalidProtocolBufferNanoException {
Favorite favorite = new Favorite();
MessageNano.mergeFrom(favorite, readCheckedBytes(buffer, offset, dataSize));
if (VERBOSE) Log.v(TAG, "unpacked favorite " + favorite.itemType + ", " +
(TextUtils.isEmpty(favorite.title) ? favorite.id : favorite.title));
ContentValues values = new ContentValues();
values.put(Favorites._ID, favorite.id);
values.put(Favorites.SCREEN, favorite.screen);
values.put(Favorites.CONTAINER, favorite.container);
values.put(Favorites.CELLX, favorite.cellX);
values.put(Favorites.CELLY, favorite.cellY);
values.put(Favorites.SPANX, favorite.spanX);
values.put(Favorites.SPANY, favorite.spanY);
values.put(Favorites.ICON_TYPE, favorite.iconType);
if (favorite.iconType == Favorites.ICON_TYPE_RESOURCE) {
values.put(Favorites.ICON_PACKAGE, favorite.iconPackage);
values.put(Favorites.ICON_RESOURCE, favorite.iconResource);
}
if (favorite.iconType == Favorites.ICON_TYPE_BITMAP) {
values.put(Favorites.ICON, favorite.icon);
}
if (!TextUtils.isEmpty(favorite.title)) {
values.put(Favorites.TITLE, favorite.title);
} else {
values.put(Favorites.TITLE, "");
}
if (!TextUtils.isEmpty(favorite.intent)) {
values.put(Favorites.INTENT, favorite.intent);
}
values.put(Favorites.ITEM_TYPE, favorite.itemType);
if (favorite.itemType == Favorites.ITEM_TYPE_APPWIDGET) {
if (!TextUtils.isEmpty(favorite.appWidgetProvider)) {
values.put(Favorites.APPWIDGET_PROVIDER, favorite.appWidgetProvider);
}
values.put(Favorites.APPWIDGET_ID, favorite.appWidgetId);
}
// Let LauncherModel know we've been here.
values.put(LauncherSettings.Favorites.RESTORED, 1);
return values;
}
public byte[] toByteArray() {
return MessageNano.toByteArray(toMessageNano());
}
/**
* Encodes the given proto location descriptor into a BASE64 URL_SAFE encoding.
*/
private static String encodeLocationDescriptor(
PartnerLocationDescriptor.LocationDescriptor locationDescriptor) {
return Base64.encodeToString(
MessageNano.toByteArray(locationDescriptor), Base64.NO_WRAP | Base64.URL_SAFE);
}
static <T extends MessageNano> void writeToParcel(Class<T> clazz, MessageNano message,
Parcel out) {
out.writeString(clazz.getName());
out.writeByteArray(MessageNano.toByteArray(message));
}