diff --git a/tests/MyGame/MonsterExtraT.java b/tests/MyGame/MonsterExtraT.java
new file mode 100644
index 0000000..4ec1932
--- /dev/null
+++ b/tests/MyGame/MonsterExtraT.java
@@ -0,0 +1,84 @@
+// automatically generated by the FlatBuffers compiler, do not modify
+
+package MyGame;
+
+import java.nio.*;
+import java.lang.*;
+import java.util.*;
+import com.google.flatbuffers.*;
+
+public class MonsterExtraT {
+  private double d0;
+  private double d1;
+  private double d2;
+  private double d3;
+  private float f0;
+  private float f1;
+  private float f2;
+  private float f3;
+  private double[] dvec;
+  private float[] fvec;
+
+  public double getD0() { return d0; }
+
+  public void setD0(double d0) { this.d0 = d0; }
+
+  public double getD1() { return d1; }
+
+  public void setD1(double d1) { this.d1 = d1; }
+
+  public double getD2() { return d2; }
+
+  public void setD2(double d2) { this.d2 = d2; }
+
+  public double getD3() { return d3; }
+
+  public void setD3(double d3) { this.d3 = d3; }
+
+  public float getF0() { return f0; }
+
+  public void setF0(float f0) { this.f0 = f0; }
+
+  public float getF1() { return f1; }
+
+  public void setF1(float f1) { this.f1 = f1; }
+
+  public float getF2() { return f2; }
+
+  public void setF2(float f2) { this.f2 = f2; }
+
+  public float getF3() { return f3; }
+
+  public void setF3(float f3) { this.f3 = f3; }
+
+  public double[] getDvec() { return dvec; }
+
+  public void setDvec(double[] dvec) { this.dvec = dvec; }
+
+  public float[] getFvec() { return fvec; }
+
+  public void setFvec(float[] fvec) { this.fvec = fvec; }
+
+
+  public MonsterExtraT() {
+    this.d0 = Double.NaN;
+    this.d1 = Double.NaN;
+    this.d2 = Double.POSITIVE_INFINITY;
+    this.d3 = Double.NEGATIVE_INFINITY;
+    this.f0 = Float.NaN;
+    this.f1 = Float.NaN;
+    this.f2 = Float.POSITIVE_INFINITY;
+    this.f3 = Float.NEGATIVE_INFINITY;
+    this.dvec = null;
+    this.fvec = null;
+  }
+  public static MonsterExtraT deserializeFromBinary(byte[] fbBuffer) {
+    return MonsterExtra.getRootAsMonsterExtra(ByteBuffer.wrap(fbBuffer)).unpack();
+  }
+  public byte[] serializeToBinary() {
+    FlatBufferBuilder fbb = new FlatBufferBuilder();
+    MonsterExtra.finishMonsterExtraBuffer(fbb, MonsterExtra.pack(fbb, this));
+    return fbb.sizedByteArray();
+  }
+}
+
