[BAEL-5907] flatbuffers (#15969)
This commit is contained in:
parent
344e89b2ff
commit
d8f2881d45
|
@ -0,0 +1,29 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<parent>
|
||||||
|
<groupId>com.baeldung</groupId>
|
||||||
|
<artifactId>parent-modules</artifactId>
|
||||||
|
<version>1.0.0-SNAPSHOT</version>
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
<artifactId>libraries-data-io-2</artifactId>
|
||||||
|
<name>libraries-data-io-3</name>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<maven.compiler.source>19</maven.compiler.source>
|
||||||
|
<maven.compiler.target>19</maven.compiler.target>
|
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
<google-flatbuffers.version>23.5.26</google-flatbuffers.version>
|
||||||
|
</properties>
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.google.flatbuffers</groupId>
|
||||||
|
<artifactId>flatbuffers-java</artifactId>
|
||||||
|
<version>${google-flatbuffers.version}</version>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
</project>
|
|
@ -0,0 +1,18 @@
|
||||||
|
// automatically generated by the FlatBuffers compiler, do not modify
|
||||||
|
|
||||||
|
package MyGame.terrains;
|
||||||
|
|
||||||
|
@SuppressWarnings("unused")
|
||||||
|
public final class Color {
|
||||||
|
private Color() { }
|
||||||
|
public static final byte Brown = 0;
|
||||||
|
public static final byte Red = 1;
|
||||||
|
public static final byte Green = 2;
|
||||||
|
public static final byte Blue = 3;
|
||||||
|
public static final byte White = 4;
|
||||||
|
|
||||||
|
public static final String[] names = { "Brown", "Red", "Green", "Blue", "White", };
|
||||||
|
|
||||||
|
public static String name(int e) { return names[e]; }
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,51 @@
|
||||||
|
// automatically generated by the FlatBuffers compiler, do not modify
|
||||||
|
|
||||||
|
package MyGame.terrains;
|
||||||
|
|
||||||
|
import java.nio.ByteBuffer;
|
||||||
|
import java.nio.ByteOrder;
|
||||||
|
|
||||||
|
import com.google.flatbuffers.BaseVector;
|
||||||
|
import com.google.flatbuffers.Constants;
|
||||||
|
import com.google.flatbuffers.FlatBufferBuilder;
|
||||||
|
import com.google.flatbuffers.Table;
|
||||||
|
|
||||||
|
@SuppressWarnings("unused")
|
||||||
|
public final class Effect extends Table {
|
||||||
|
public static void ValidateVersion() { Constants.FLATBUFFERS_23_5_26(); }
|
||||||
|
public static Effect getRootAsEffect(ByteBuffer _bb) { return getRootAsEffect(_bb, new Effect()); }
|
||||||
|
public static Effect getRootAsEffect(ByteBuffer _bb, Effect obj) { _bb.order(ByteOrder.LITTLE_ENDIAN); return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb)); }
|
||||||
|
public void __init(int _i, ByteBuffer _bb) { __reset(_i, _bb); }
|
||||||
|
public Effect __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }
|
||||||
|
|
||||||
|
public String name() { int o = __offset(4); return o != 0 ? __string(o + bb_pos) : null; }
|
||||||
|
public ByteBuffer nameAsByteBuffer() { return __vector_as_bytebuffer(4, 1); }
|
||||||
|
public ByteBuffer nameInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 4, 1); }
|
||||||
|
public short damage() { int o = __offset(6); return o != 0 ? bb.getShort(o + bb_pos) : 0; }
|
||||||
|
public boolean mutateDamage(short damage) { int o = __offset(6); if (o != 0) { bb.putShort(o + bb_pos, damage); return true; } else { return false; } }
|
||||||
|
|
||||||
|
public static int createEffect(FlatBufferBuilder builder,
|
||||||
|
int nameOffset,
|
||||||
|
short damage) {
|
||||||
|
builder.startTable(2);
|
||||||
|
Effect.addName(builder, nameOffset);
|
||||||
|
Effect.addDamage(builder, damage);
|
||||||
|
return Effect.endEffect(builder);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void startEffect(FlatBufferBuilder builder) { builder.startTable(2); }
|
||||||
|
public static void addName(FlatBufferBuilder builder, int nameOffset) { builder.addOffset(0, nameOffset, 0); }
|
||||||
|
public static void addDamage(FlatBufferBuilder builder, short damage) { builder.addShort(1, damage, 0); }
|
||||||
|
public static int endEffect(FlatBufferBuilder builder) {
|
||||||
|
int o = builder.endTable();
|
||||||
|
return o;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final class Vector extends BaseVector {
|
||||||
|
public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; }
|
||||||
|
|
||||||
|
public Effect get(int j) { return get(new Effect(), j); }
|
||||||
|
public Effect get(Effect obj, int j) { return obj.__assign(__indirect(__element(j), bb), bb); }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,59 @@
|
||||||
|
// automatically generated by the FlatBuffers compiler, do not modify
|
||||||
|
|
||||||
|
package MyGame.terrains;
|
||||||
|
|
||||||
|
import java.nio.ByteBuffer;
|
||||||
|
import java.nio.ByteOrder;
|
||||||
|
|
||||||
|
import com.google.flatbuffers.BaseVector;
|
||||||
|
import com.google.flatbuffers.Constants;
|
||||||
|
import com.google.flatbuffers.FlatBufferBuilder;
|
||||||
|
import com.google.flatbuffers.Table;
|
||||||
|
|
||||||
|
@SuppressWarnings("unused")
|
||||||
|
public final class Terrain extends Table {
|
||||||
|
public static void ValidateVersion() { Constants.FLATBUFFERS_23_5_26(); }
|
||||||
|
public static Terrain getRootAsTerrain(ByteBuffer _bb) { return getRootAsTerrain(_bb, new Terrain()); }
|
||||||
|
public static Terrain getRootAsTerrain(ByteBuffer _bb, Terrain obj) { _bb.order(ByteOrder.LITTLE_ENDIAN); return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb)); }
|
||||||
|
public void __init(int _i, ByteBuffer _bb) { __reset(_i, _bb); }
|
||||||
|
public Terrain __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }
|
||||||
|
|
||||||
|
public MyGame.terrains.Vec3 pos() { return pos(new MyGame.terrains.Vec3()); }
|
||||||
|
public MyGame.terrains.Vec3 pos(MyGame.terrains.Vec3 obj) { int o = __offset(4); return o != 0 ? obj.__assign(o + bb_pos, bb) : null; }
|
||||||
|
public String name() { int o = __offset(6); return o != 0 ? __string(o + bb_pos) : null; }
|
||||||
|
public ByteBuffer nameAsByteBuffer() { return __vector_as_bytebuffer(6, 1); }
|
||||||
|
public ByteBuffer nameInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 6, 1); }
|
||||||
|
public byte color() { int o = __offset(8); return o != 0 ? bb.get(o + bb_pos) : 3; }
|
||||||
|
public boolean mutateColor(byte color) { int o = __offset(8); if (o != 0) { bb.put(o + bb_pos, color); return true; } else { return false; } }
|
||||||
|
public String navigation() { int o = __offset(10); return o != 0 ? __string(o + bb_pos) : null; }
|
||||||
|
public ByteBuffer navigationAsByteBuffer() { return __vector_as_bytebuffer(10, 1); }
|
||||||
|
public ByteBuffer navigationInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 10, 1); }
|
||||||
|
public MyGame.terrains.Effect effects(int j) { return effects(new MyGame.terrains.Effect(), j); }
|
||||||
|
public MyGame.terrains.Effect effects(MyGame.terrains.Effect obj, int j) { int o = __offset(12); return o != 0 ? obj.__assign(__indirect(__vector(o) + j * 4), bb) : null; }
|
||||||
|
public int effectsLength() { int o = __offset(12); return o != 0 ? __vector_len(o) : 0; }
|
||||||
|
public MyGame.terrains.Effect.Vector effectsVector() { return effectsVector(new MyGame.terrains.Effect.Vector()); }
|
||||||
|
public MyGame.terrains.Effect.Vector effectsVector(MyGame.terrains.Effect.Vector obj) { int o = __offset(12); return o != 0 ? obj.__assign(__vector(o), 4, bb) : null; }
|
||||||
|
|
||||||
|
public static void startTerrain(FlatBufferBuilder builder) { builder.startTable(5); }
|
||||||
|
public static void addPos(FlatBufferBuilder builder, int posOffset) { builder.addStruct(0, posOffset, 0); }
|
||||||
|
public static void addName(FlatBufferBuilder builder, int nameOffset) { builder.addOffset(1, nameOffset, 0); }
|
||||||
|
public static void addColor(FlatBufferBuilder builder, byte color) { builder.addByte(2, color, 3); }
|
||||||
|
public static void addNavigation(FlatBufferBuilder builder, int navigationOffset) { builder.addOffset(3, navigationOffset, 0); }
|
||||||
|
public static void addEffects(FlatBufferBuilder builder, int effectsOffset) { builder.addOffset(4, effectsOffset, 0); }
|
||||||
|
public static int createEffectsVector(FlatBufferBuilder builder, int[] data) { builder.startVector(4, data.length, 4); for (int i = data.length - 1; i >= 0; i--) builder.addOffset(data[i]); return builder.endVector(); }
|
||||||
|
public static void startEffectsVector(FlatBufferBuilder builder, int numElems) { builder.startVector(4, numElems, 4); }
|
||||||
|
public static int endTerrain(FlatBufferBuilder builder) {
|
||||||
|
int o = builder.endTable();
|
||||||
|
return o;
|
||||||
|
}
|
||||||
|
public static void finishTerrainBuffer(FlatBufferBuilder builder, int offset) { builder.finish(offset); }
|
||||||
|
public static void finishSizePrefixedTerrainBuffer(FlatBufferBuilder builder, int offset) { builder.finishSizePrefixed(offset); }
|
||||||
|
|
||||||
|
public static final class Vector extends BaseVector {
|
||||||
|
public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; }
|
||||||
|
|
||||||
|
public Terrain get(int j) { return get(new Terrain(), j); }
|
||||||
|
public Terrain get(Terrain obj, int j) { return obj.__assign(__indirect(__element(j), bb), bb); }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,38 @@
|
||||||
|
// automatically generated by the FlatBuffers compiler, do not modify
|
||||||
|
|
||||||
|
package MyGame.terrains;
|
||||||
|
|
||||||
|
import java.nio.ByteBuffer;
|
||||||
|
|
||||||
|
import com.google.flatbuffers.BaseVector;
|
||||||
|
import com.google.flatbuffers.FlatBufferBuilder;
|
||||||
|
import com.google.flatbuffers.Struct;
|
||||||
|
|
||||||
|
@SuppressWarnings("unused")
|
||||||
|
public final class Vec3 extends Struct {
|
||||||
|
public void __init(int _i, ByteBuffer _bb) { __reset(_i, _bb); }
|
||||||
|
public Vec3 __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }
|
||||||
|
|
||||||
|
public float x() { return bb.getFloat(bb_pos + 0); }
|
||||||
|
public void mutateX(float x) { bb.putFloat(bb_pos + 0, x); }
|
||||||
|
public float y() { return bb.getFloat(bb_pos + 4); }
|
||||||
|
public void mutateY(float y) { bb.putFloat(bb_pos + 4, y); }
|
||||||
|
public float z() { return bb.getFloat(bb_pos + 8); }
|
||||||
|
public void mutateZ(float z) { bb.putFloat(bb_pos + 8, z); }
|
||||||
|
|
||||||
|
public static int createVec3(FlatBufferBuilder builder, float x, float y, float z) {
|
||||||
|
builder.prep(4, 12);
|
||||||
|
builder.putFloat(z);
|
||||||
|
builder.putFloat(y);
|
||||||
|
builder.putFloat(x);
|
||||||
|
return builder.offset();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final class Vector extends BaseVector {
|
||||||
|
public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; }
|
||||||
|
|
||||||
|
public Vec3 get(int j) { return get(new Vec3(), j); }
|
||||||
|
public Vec3 get(Vec3 obj, int j) { return obj.__assign(__element(j), bb); }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,61 @@
|
||||||
|
package com.baeldung.flatbuffers;
|
||||||
|
|
||||||
|
import static MyGame.terrains.Terrain.addColor;
|
||||||
|
import static MyGame.terrains.Terrain.addEffects;
|
||||||
|
import static MyGame.terrains.Terrain.addNavigation;
|
||||||
|
import static MyGame.terrains.Terrain.endTerrain;
|
||||||
|
import static MyGame.terrains.Terrain.startTerrain;
|
||||||
|
|
||||||
|
import java.nio.ByteBuffer;
|
||||||
|
|
||||||
|
import com.google.flatbuffers.FlatBufferBuilder;
|
||||||
|
|
||||||
|
import MyGame.terrains.Effect;
|
||||||
|
import MyGame.terrains.Terrain;
|
||||||
|
|
||||||
|
public class MyGameMain {
|
||||||
|
|
||||||
|
public byte[] serialiseDesertTerrainData() {
|
||||||
|
int INITIAL_BUFFER = 1024;
|
||||||
|
FlatBufferBuilder builder = new FlatBufferBuilder(INITIAL_BUFFER);
|
||||||
|
|
||||||
|
int sandstormOffset = builder.createString("Sandstorm");
|
||||||
|
short damage = 3;
|
||||||
|
int sandStorm = MyGame.terrains.Effect.createEffect(builder, sandstormOffset, damage);
|
||||||
|
|
||||||
|
int droughtOffset = builder.createString("Drought");
|
||||||
|
short damageDrought = 1;
|
||||||
|
int drought = MyGame.terrains.Effect.createEffect(builder, droughtOffset, damageDrought);
|
||||||
|
int[] effects = new int[2];
|
||||||
|
effects[0] = sandStorm;
|
||||||
|
effects[1] = drought;
|
||||||
|
|
||||||
|
byte color = MyGame.terrains.Color.Brown;
|
||||||
|
int terrainName = builder.createString("Desert");
|
||||||
|
int navigationName = builder.createString("south");
|
||||||
|
|
||||||
|
int effectOffset = MyGame.terrains.Terrain.createEffectsVector(builder, effects);
|
||||||
|
|
||||||
|
startTerrain(builder);
|
||||||
|
MyGame.terrains.Terrain.addName(builder, terrainName);
|
||||||
|
addColor(builder, color);
|
||||||
|
addNavigation(builder, navigationName);
|
||||||
|
addEffects(builder, effectOffset);
|
||||||
|
int desert = endTerrain(builder);
|
||||||
|
builder.finish(desert);
|
||||||
|
|
||||||
|
return builder.sizedByteArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
public MyGame.terrains.Terrain deserialiseDataToTerrain(byte[] buffer) {
|
||||||
|
ByteBuffer buf = ByteBuffer.wrap(buffer);
|
||||||
|
return Terrain.getRootAsTerrain(buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Effect.Vector deserialiseDataToEffect(byte[] buffer) {
|
||||||
|
ByteBuffer buf = ByteBuffer.wrap(buffer);
|
||||||
|
|
||||||
|
return Terrain.getRootAsTerrain(buf)
|
||||||
|
.effectsVector();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,25 @@
|
||||||
|
|
||||||
|
namespace MyGame.terrains;
|
||||||
|
|
||||||
|
enum Color:byte { Brown = 0, Red = 1, Green = 2, Blue = 3, White = 4 }
|
||||||
|
|
||||||
|
struct Vec3 {
|
||||||
|
x:float;
|
||||||
|
y:float;
|
||||||
|
z:float;
|
||||||
|
}
|
||||||
|
|
||||||
|
table Terrain {
|
||||||
|
pos:Vec3; // Struct.
|
||||||
|
name: string;
|
||||||
|
color:Color = Blue;
|
||||||
|
navigation: string;
|
||||||
|
effects: [Effect];
|
||||||
|
}
|
||||||
|
|
||||||
|
table Effect {
|
||||||
|
name: string;
|
||||||
|
damage: short;
|
||||||
|
}
|
||||||
|
|
||||||
|
root_type Terrain;
|
|
@ -0,0 +1,43 @@
|
||||||
|
package flatbuffers;
|
||||||
|
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import com.baeldung.flatbuffers.MyGameMain;
|
||||||
|
|
||||||
|
import MyGame.terrains.Effect;
|
||||||
|
|
||||||
|
public class FlatBufferGameUnitTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenTerrainEffect_whenSerialisedWithValues_returnBytes() {
|
||||||
|
MyGameMain myGame = new MyGameMain();
|
||||||
|
byte[] bytes = myGame.serialiseDesertTerrainData();
|
||||||
|
Assert.assertNotNull(bytes);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenSerialisedBytes_whenDeSerialised_returnsTerrain() {
|
||||||
|
MyGameMain myGame = new MyGameMain();
|
||||||
|
byte[] bytes = myGame.serialiseDesertTerrainData();
|
||||||
|
|
||||||
|
MyGame.terrains.Terrain terrain = myGame.deserialiseDataToTerrain(bytes);
|
||||||
|
Assert.assertNotNull(terrain);
|
||||||
|
Assert.assertEquals(terrain.name(), "Desert");
|
||||||
|
Assert.assertEquals(terrain.navigation(), "south");
|
||||||
|
Assert.assertEquals(MyGame.terrains.Color.name(terrain.color()), "Brown");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenSerialisedBytes_whenDeSerialised_returnsTerrainEffect() {
|
||||||
|
MyGameMain myGame = new MyGameMain();
|
||||||
|
byte[] bytes = myGame.serialiseDesertTerrainData();
|
||||||
|
|
||||||
|
Effect.Vector effectsVector = myGame.deserialiseDataToEffect(bytes);
|
||||||
|
Assert.assertNotNull(effectsVector);
|
||||||
|
Assert.assertEquals(effectsVector.get(0).name(), "Sandstorm");
|
||||||
|
Assert.assertEquals(effectsVector.get(1).name(), "Drought");
|
||||||
|
|
||||||
|
Assert.assertEquals(effectsVector.get(1).damage(), 1);
|
||||||
|
}
|
||||||
|
}
|
3
pom.xml
3
pom.xml
|
@ -8,6 +8,9 @@
|
||||||
<artifactId>parent-modules</artifactId>
|
<artifactId>parent-modules</artifactId>
|
||||||
<version>1.0.0-SNAPSHOT</version>
|
<version>1.0.0-SNAPSHOT</version>
|
||||||
<name>parent-modules</name>
|
<name>parent-modules</name>
|
||||||
|
<modules>
|
||||||
|
<module>libraries-data-io-2</module>
|
||||||
|
</modules>
|
||||||
|
|
||||||
<packaging>pom</packaging>
|
<packaging>pom</packaging>
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue