diff --git a/solr/solrj/src/java/org/apache/solr/common/util/JavaBinCodec.java b/solr/solrj/src/java/org/apache/solr/common/util/JavaBinCodec.java index 905f6b9..634ecb4 100644 --- a/solr/solrj/src/java/org/apache/solr/common/util/JavaBinCodec.java +++ b/solr/solrj/src/java/org/apache/solr/common/util/JavaBinCodec.java @@ -53,6 +53,8 @@ import org.noggit.CharArr; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import static org.apache.solr.common.util.ByteArrayUtf8CharSequence.convertCharSeq; + /** * Defines a space-efficient serialization/deserialization format for transferring data. *

@@ -810,7 +812,7 @@ public class JavaBinCodec implements PushWriter { */ public EnumFieldValue readEnumFieldValue(DataInputInputStream dis) throws IOException { Integer intValue = (Integer) readVal(dis); - String stringValue = (String) readVal(dis); + String stringValue = (String) convertCharSeq (readVal(dis)); return new EnumFieldValue(intValue, stringValue); } diff --git a/solr/solrj/src/test/org/apache/solr/common/util/TestJavaBinCodec.java b/solr/solrj/src/test/org/apache/solr/common/util/TestJavaBinCodec.java index e60d8c7..24c9c22 100644 --- a/solr/solrj/src/test/org/apache/solr/common/util/TestJavaBinCodec.java +++ b/solr/solrj/src/test/org/apache/solr/common/util/TestJavaBinCodec.java @@ -65,6 +65,19 @@ public class TestJavaBinCodec extends SolrTestCaseJ4 { } } + public void testReadAsCharSeq() throws Exception { + List types = new ArrayList<>(); + SolrInputDocument idoc = new SolrInputDocument(); + idoc.addField("foo", "bar"); + idoc.addField("foos", Arrays.asList("bar1","bar2")); + idoc.addField("enumf", new EnumFieldValue(1, "foo")); + types.add(idoc); + compareObjects( + (List) getObject(getBytes(types, true)), + (List) types + ); + } + private SolrDocument generateSolrDocumentWithChildDocs() { SolrDocument parentDocument = new SolrDocument(); parentDocument.addField("id", "1"); @@ -284,6 +297,14 @@ public class TestJavaBinCodec extends SolrTestCaseJ4 { } } + private static byte[] getBytes(Object o, boolean readAsCharSeq) throws IOException { + try (JavaBinCodec javabin = new JavaBinCodec(); ByteArrayOutputStream baos = new ByteArrayOutputStream()) { + javabin.readStringAsCharSeq = readAsCharSeq; + javabin.marshal(o, baos); + return baos.toByteArray(); + } + } + private static Object getObject(byte[] bytes) throws IOException { try (JavaBinCodec jbc = new JavaBinCodec()) { return jbc.unmarshal(new ByteArrayInputStream(bytes));