@@ -103,6 +103,7 @@ public class JavaBinCodec implements PushWriter {
103103 MAP_ENTRY = 19 ,
104104 UUID = 20 , // This is reserved to be used only in LogCodec
105105 // types that combine tag + length (or other info) in a single byte
106+ PRIMITIVE_ARR = 21 ,
106107 TAG_AND_LEN = (byte ) (1 << 5 ),
107108 STR = (byte ) (1 << 5 ),
108109 SINT = (byte ) (2 << 5 ),
@@ -348,6 +349,8 @@ protected Object readObject(DataInputInputStream dis) throws IOException {
348349 return readMapEntry (dis );
349350 case MAP_ENTRY_ITER :
350351 return readMapIter (dis );
352+ case PRIMITIVE_ARR :
353+ return readPrimitiveArray (dis );
351354 }
352355
353356 throw new RuntimeException ("Unknown type " + tagByte );
@@ -438,9 +441,150 @@ public boolean writeKnownType(Object val) throws IOException {
438441 writeBoolean (((AtomicBoolean ) val ).get ());
439442 return true ;
440443 }
444+ if (val instanceof float [] ff ) {
445+ writeFloatArr (ff );
446+ return true ;
447+ }
448+ if (val instanceof int [] ii ) {
449+ writeIntArr (ii );
450+ return true ;
451+ }
452+ if (val instanceof long [] ll ) {
453+ writeLongArr (ll );
454+ return true ;
455+ }
456+ if (val instanceof double [] dd ) {
457+ writeDoubleArr (dd );
458+ return true ;
459+ }
460+ if (val instanceof short [] ss ) {
461+ writeShortArr (ss );
462+ return true ;
463+ }
464+ if (val instanceof boolean [] bb ) {
465+ writeBoolArr (bb );
466+ return true ;
467+ }
441468 return false ;
442469 }
443470
471+ public Object readPrimitiveArray (DataInputInputStream dis ) throws IOException {
472+ tagByte = dis .readByte ();
473+ int len = readVInt (dis );
474+ switch (tagByte ) {
475+ case FLOAT :
476+ {
477+ float [] v = new float [len ];
478+ for (int i = 0 ; i < len ; i ++) {
479+ v [i ] = dis .readFloat ();
480+ }
481+ return v ;
482+ }
483+ case INT :
484+ {
485+ int [] v = new int [len ];
486+ for (int i = 0 ; i < len ; i ++) {
487+ v [i ] = dis .readInt ();
488+ }
489+ return v ;
490+ }
491+
492+ case LONG :
493+ {
494+ long [] v = new long [len ];
495+ for (int i = 0 ; i < len ; i ++) {
496+ v [i ] = dis .readLong ();
497+ }
498+ return v ;
499+ }
500+ case DOUBLE :
501+ {
502+ double [] v = new double [len ];
503+ for (int i = 0 ; i < len ; i ++) {
504+ v [i ] = dis .readDouble ();
505+ }
506+ return v ;
507+ }
508+ case SHORT :
509+ {
510+ short [] v = new short [len ];
511+ for (int i = 0 ; i < len ; i ++) {
512+ v [i ] = dis .readShort ();
513+ }
514+ return v ;
515+ }
516+ case BOOL_TRUE :
517+ case BOOL_FALSE :
518+ {
519+ boolean [] v = new boolean [len ];
520+ for (int i = 0 ; i < len ; i ++) {
521+ byte b = dis .readByte ();
522+ v [i ] = b == BOOL_FALSE ? false : true ;
523+ }
524+ return v ;
525+ }
526+ case BYTE :
527+ {
528+ // it should be possible to serialize byte[] in the new format as well
529+ byte [] v = new byte [len ];
530+ dis .readFully (v );
531+ return v ;
532+ }
533+ default :
534+ {
535+ throw new RuntimeException ("Invalid type : " + tagByte );
536+ }
537+ }
538+ }
539+
540+ public void writePrimitiveArrHeader (byte tag , int len ) throws IOException {
541+ writeTag (PRIMITIVE_ARR );
542+ writeTag (tag );
543+ writeVInt (len , daos );
544+ }
545+
546+ public void writeFloatArr (float [] vals ) throws IOException {
547+ writePrimitiveArrHeader (FLOAT , vals .length );
548+ for (float f : vals ) {
549+ daos .writeFloat (f );
550+ }
551+ }
552+
553+ public void writeIntArr (int [] vals ) throws IOException {
554+ writePrimitiveArrHeader (INT , vals .length );
555+ for (int i : vals ) {
556+ daos .writeInt (i );
557+ }
558+ }
559+
560+ public void writeDoubleArr (double [] vals ) throws IOException {
561+ writePrimitiveArrHeader (DOUBLE , vals .length );
562+ for (double d : vals ) {
563+ daos .writeDouble (d );
564+ }
565+ }
566+
567+ public void writeLongArr (long [] vals ) throws IOException {
568+ writePrimitiveArrHeader (LONG , vals .length );
569+ for (long l : vals ) {
570+ daos .writeLong (l );
571+ }
572+ }
573+
574+ public void writeBoolArr (boolean [] vals ) throws IOException {
575+ writePrimitiveArrHeader (BOOL_TRUE , vals .length );
576+ for (boolean b : vals ) {
577+ writeBoolean (b );
578+ }
579+ }
580+
581+ public void writeShortArr (short [] vals ) throws IOException {
582+ writePrimitiveArrHeader (SHORT , vals .length );
583+ for (short l : vals ) {
584+ daos .writeShort (l );
585+ }
586+ }
587+
444588 public class BinEntryWriter implements MapWriter .EntryWriter {
445589 @ Override
446590 public MapWriter .EntryWriter put (CharSequence k , Object v ) throws IOException {
0 commit comments