You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@avro.apache.org by fo...@apache.org on 2019/07/19 07:48:59 UTC

[avro] branch master updated: AVRO-1852: Make Java org.apache.Schema serializable (#589)

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

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


The following commit(s) were added to refs/heads/master by this push:
     new e19fe14  AVRO-1852: Make Java org.apache.Schema serializable (#589)
e19fe14 is described below

commit e19fe14a3a945539a66b672c74740ede19af6b6e
Author: RyanSkraba <rs...@talend.com>
AuthorDate: Fri Jul 19 09:48:53 2019 +0200

    AVRO-1852: Make Java org.apache.Schema serializable (#589)
    
    * [add] [AVRO-1852]
    
    * AVRO-1852: Update unit tests with feedback.
---
 .../avro/src/main/java/org/apache/avro/Schema.java | 23 +++++++++++++++++++++-
 .../src/test/java/org/apache/avro/TestSchema.java  | 23 ++++++++++++++++++++++
 2 files changed, 45 insertions(+), 1 deletion(-)

diff --git a/lang/java/avro/src/main/java/org/apache/avro/Schema.java b/lang/java/avro/src/main/java/org/apache/avro/Schema.java
index d5e8735..c3052ad 100644
--- a/lang/java/avro/src/main/java/org/apache/avro/Schema.java
+++ b/lang/java/avro/src/main/java/org/apache/avro/Schema.java
@@ -29,6 +29,7 @@ import com.fasterxml.jackson.databind.node.NullNode;
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.Serializable;
 import java.io.StringWriter;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -83,7 +84,27 @@ import org.apache.avro.util.internal.JacksonUtils;
  * property.
  * </ul>
  */
-public abstract class Schema extends JsonProperties {
+public abstract class Schema extends JsonProperties implements Serializable {
+
+  private static final long serialVersionUID = 1L;
+
+  protected Object writeReplace() {
+    SerializableSchema ss = new SerializableSchema();
+    ss.schemaString = toString();
+    return ss;
+  }
+
+  private static final class SerializableSchema implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    private String schemaString;
+
+    private Object readResolve() {
+      return new Schema.Parser().parse(schemaString);
+    }
+  }
+
   static final JsonFactory FACTORY = new JsonFactory();
   static final ObjectMapper MAPPER = new ObjectMapper(FACTORY);
 
diff --git a/lang/java/avro/src/test/java/org/apache/avro/TestSchema.java b/lang/java/avro/src/test/java/org/apache/avro/TestSchema.java
index c0e4cec..43531c7 100644
--- a/lang/java/avro/src/test/java/org/apache/avro/TestSchema.java
+++ b/lang/java/avro/src/test/java/org/apache/avro/TestSchema.java
@@ -19,6 +19,12 @@ package org.apache.avro;
 
 import static org.junit.Assert.*;
 
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
@@ -177,4 +183,21 @@ public class TestSchema {
     return Schema.createRecord("name", "doc", "namespace", false);
   }
 
+  @Test
+  public void testSerialization() throws IOException, ClassNotFoundException {
+    try (ByteArrayOutputStream bos = new ByteArrayOutputStream();
+        ObjectOutputStream oos = new ObjectOutputStream(bos);
+        InputStream jsonSchema = getClass().getResourceAsStream("/SchemaBuilder.avsc")) {
+
+      Schema payload = new Schema.Parser().parse(jsonSchema);
+      oos.writeObject(payload);
+
+      try (ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
+          ObjectInputStream ois = new ObjectInputStream(bis)) {
+        Schema sp = (Schema) ois.readObject();
+        assertEquals(payload, sp);
+      }
+    }
+  }
+
 }