public Common.Frame toProto() { Common.Frame.Builder builder = Common.Frame.newBuilder(); builder.setDone(done).setOffset(offset); for (Object row : this.rows) { if (null == row) { // Does this need to be persisted for some reason? continue; } if (row instanceof Object[]) { final Common.Row.Builder rowBuilder = Common.Row.newBuilder(); for (Object element : (Object[]) row) { final Common.TypedValue.Builder valueBuilder = Common.TypedValue.newBuilder(); // Numbers if (element instanceof Byte) { valueBuilder.setType(Common.Rep.BYTE).setNumberValue(((Byte) element).longValue()); } else if (element instanceof Short) { valueBuilder.setType(Common.Rep.SHORT).setNumberValue(((Short) element).longValue()); } else if (element instanceof Integer) { valueBuilder .setType(Common.Rep.INTEGER) .setNumberValue(((Integer) element).longValue()); } else if (element instanceof Long) { valueBuilder.setType(Common.Rep.LONG).setNumberValue((Long) element); } else if (element instanceof Double) { valueBuilder .setType(Common.Rep.DOUBLE) .setDoubleValue(((Double) element).doubleValue()); } else if (element instanceof Float) { valueBuilder.setType(Common.Rep.FLOAT).setNumberValue(((Float) element).longValue()); } else if (element instanceof BigDecimal) { valueBuilder .setType(Common.Rep.NUMBER) .setDoubleValue(((BigDecimal) element).doubleValue()); // Strings } else if (element instanceof String) { valueBuilder.setType(Common.Rep.STRING).setStringValue((String) element); } else if (element instanceof Character) { valueBuilder .setType(Common.Rep.CHARACTER) .setStringValue(((Character) element).toString()); // Bytes } else if (element instanceof byte[]) { valueBuilder .setType(Common.Rep.BYTE_STRING) .setBytesValues(ByteString.copyFrom((byte[]) element)); // Boolean } else if (element instanceof Boolean) { valueBuilder.setType(Common.Rep.BOOLEAN).setBoolValue((boolean) element); } else if (null == element) { valueBuilder.setType(Common.Rep.NULL); // Unhandled } else { throw new RuntimeException("Unhandled type in Frame: " + element.getClass()); } // Add value to row rowBuilder.addValue(valueBuilder.build()); } // Collect all rows builder.addRows(rowBuilder.build()); } else { // Can a "row" be a primitive? A struct? Only an Array? throw new RuntimeException("Only arrays are supported"); } } return builder.build(); }