This is an automated email from the ASF dual-hosted git repository.

dmollitor pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/avro.git


The following commit(s) were added to refs/heads/main by this push:
     new ec2378b27 AVRO-4073: Create Convenience toBytes Method for Datum 
Writer (#3197)
ec2378b27 is described below

commit ec2378b278c463646d9ad9c4fdd9e1057018174c
Author: belugabehr <[email protected]>
AuthorDate: Sun Oct 6 20:44:04 2024 -0400

    AVRO-4073: Create Convenience toBytes Method for Datum Writer (#3197)
---
 .../src/main/java/org/apache/avro/io/DatumWriter.java    | 16 ++++++++++++++++
 .../java/org/apache/avro/specific/TestSpecificData.java  | 14 ++++++++++++++
 2 files changed, 30 insertions(+)

diff --git a/lang/java/avro/src/main/java/org/apache/avro/io/DatumWriter.java 
b/lang/java/avro/src/main/java/org/apache/avro/io/DatumWriter.java
index f1e576269..050c25b46 100644
--- a/lang/java/avro/src/main/java/org/apache/avro/io/DatumWriter.java
+++ b/lang/java/avro/src/main/java/org/apache/avro/io/DatumWriter.java
@@ -17,6 +17,7 @@
  */
 package org.apache.avro.io;
 
+import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 
 import org.apache.avro.Schema;
@@ -36,4 +37,19 @@ public interface DatumWriter<D> {
    * the schema from the datum to the output.
    */
   void write(D datum, Encoder out) throws IOException;
+
+  /**
+   * Convenience method to Write a datum to a byte array. Traverse the schema,
+   * depth first, writing each leaf value in the schema from the datum to the 
byte
+   * array.
+   *
+   * @param datum The datum to serialize
+   * @return The serialized datum stored in an array of bytes
+   */
+  default byte[] toByteArray(D datum) throws IOException {
+    try (ByteArrayOutputStream out = new ByteArrayOutputStream(128)) {
+      write(datum, EncoderFactory.get().directBinaryEncoder(out, null));
+      return out.toByteArray();
+    }
+  }
 }
diff --git 
a/lang/java/avro/src/test/java/org/apache/avro/specific/TestSpecificData.java 
b/lang/java/avro/src/test/java/org/apache/avro/specific/TestSpecificData.java
index 5c8cad853..1d9d58b05 100644
--- 
a/lang/java/avro/src/test/java/org/apache/avro/specific/TestSpecificData.java
+++ 
b/lang/java/avro/src/test/java/org/apache/avro/specific/TestSpecificData.java
@@ -179,6 +179,20 @@ public class TestSpecificData {
     }
   }
 
+  @Test
+  void testToByteArray() throws Exception {
+    final Schema string = Schema.create(Type.STRING);
+    final DatumWriter<String> writer = new SpecificDatumWriter<>(string);
+
+    try (final ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
+      final Encoder encoder = EncoderFactory.get().directBinaryEncoder(baos, 
null);
+      writer.write("test", encoder);
+
+      final byte[] bytes = writer.toByteArray("test");
+      assertArrayEquals(baos.toByteArray(), bytes);
+    }
+  }
+
   @Test
   void classNameContainingReservedWords() {
     final Schema schema = Schema.createRecord("AnyName", null, 
"db.public.table", false);

Reply via email to