package com.badlogic.gdx.ai.tests.btree; import org.objenesis.strategy.StdInstantiatorStrategy; import com.badlogic.gdx.ai.btree.BehaviorTree; import com.badlogic.gdx.ai.utils.random.ConstantDoubleDistribution; import com.badlogic.gdx.ai.utils.random.ConstantFloatDistribution; import com.badlogic.gdx.ai.utils.random.ConstantIntegerDistribution; import com.badlogic.gdx.ai.utils.random.ConstantLongDistribution; import com.badlogic.gdx.ai.utils.random.Distribution; import com.badlogic.gdx.ai.utils.random.GaussianDoubleDistribution; import com.badlogic.gdx.ai.utils.random.GaussianFloatDistribution; import com.badlogic.gdx.ai.utils.random.TriangularDoubleDistribution; import com.badlogic.gdx.ai.utils.random.TriangularFloatDistribution; import com.badlogic.gdx.ai.utils.random.TriangularIntegerDistribution; import com.badlogic.gdx.ai.utils.random.TriangularLongDistribution; import com.badlogic.gdx.ai.utils.random.UniformDoubleDistribution; import com.badlogic.gdx.ai.utils.random.UniformFloatDistribution; import com.badlogic.gdx.ai.utils.random.UniformIntegerDistribution; import com.badlogic.gdx.ai.utils.random.UniformLongDistribution; import com.esotericsoftware.kryo.Kryo; import com.esotericsoftware.kryo.Kryo.DefaultInstantiatorStrategy; import com.esotericsoftware.kryo.Serializer; import com.esotericsoftware.kryo.io.ByteBufferInput; import com.esotericsoftware.kryo.io.Input; import com.esotericsoftware.kryo.io.Output; import com.esotericsoftware.kryo.io.OutputChunked; public final class KryoUtils { private static final Kryo kryo; private static final OutputChunked output = new OutputChunked(); private KryoUtils () { } static { kryo = new Kryo(); kryo.setInstantiatorStrategy(new DefaultInstantiatorStrategy(new StdInstantiatorStrategy())); kryo.register(ConstantDoubleDistribution.class, new DistributionSerializer<ConstantDoubleDistribution>() { @Override public void write (Kryo kryo, Output output, ConstantDoubleDistribution object) { output.writeDouble(object.getValue()); } @Override public ConstantDoubleDistribution read (Kryo kryo, Input input, Class<ConstantDoubleDistribution> type) { return new ConstantDoubleDistribution(input.readDouble()); } }); kryo.register(ConstantFloatDistribution.class, new DistributionSerializer<ConstantFloatDistribution>() { @Override public void write (Kryo kryo, Output output, ConstantFloatDistribution object) { output.writeFloat(object.getValue()); } @Override public ConstantFloatDistribution read (Kryo kryo, Input input, Class<ConstantFloatDistribution> type) { return new ConstantFloatDistribution(input.readFloat()); } }); kryo.register(ConstantIntegerDistribution.class, new DistributionSerializer<ConstantIntegerDistribution>() { @Override public void write (Kryo kryo, Output output, ConstantIntegerDistribution object) { output.writeInt(object.getValue()); } @Override public ConstantIntegerDistribution read (Kryo kryo, Input input, Class<ConstantIntegerDistribution> type) { return new ConstantIntegerDistribution(input.readInt()); } }); kryo.register(ConstantLongDistribution.class, new DistributionSerializer<ConstantLongDistribution>() { @Override public void write (Kryo kryo, Output output, ConstantLongDistribution object) { output.writeLong(object.getValue()); } @Override public ConstantLongDistribution read (Kryo kryo, Input input, Class<ConstantLongDistribution> type) { return new ConstantLongDistribution(input.readLong()); } }); kryo.register(GaussianDoubleDistribution.class, new DistributionSerializer<GaussianDoubleDistribution>() { @Override public void write (Kryo kryo, Output output, GaussianDoubleDistribution object) { output.writeDouble(object.getMean()); output.writeDouble(object.getStandardDeviation()); } @Override public GaussianDoubleDistribution read (Kryo kryo, Input input, Class<GaussianDoubleDistribution> type) { return new GaussianDoubleDistribution(input.readDouble(), input.readDouble()); } }); kryo.register(GaussianFloatDistribution.class, new DistributionSerializer<GaussianFloatDistribution>() { @Override public void write (Kryo kryo, Output output, GaussianFloatDistribution object) { output.writeFloat(object.getMean()); output.writeFloat(object.getStandardDeviation()); } @Override public GaussianFloatDistribution read (Kryo kryo, Input input, Class<GaussianFloatDistribution> type) { return new GaussianFloatDistribution(input.readFloat(), input.readFloat()); } }); kryo.register(TriangularDoubleDistribution.class, new DistributionSerializer<TriangularDoubleDistribution>() { @Override public void write (Kryo kryo, Output output, TriangularDoubleDistribution object) { output.writeDouble(object.getLow()); output.writeDouble(object.getHigh()); output.writeDouble(object.getMode()); } @Override public TriangularDoubleDistribution read (Kryo kryo, Input input, Class<TriangularDoubleDistribution> type) { return new TriangularDoubleDistribution(input.readDouble(), input.readDouble(), input.readDouble()); } }); kryo.register(TriangularFloatDistribution.class, new DistributionSerializer<TriangularFloatDistribution>() { @Override public void write (Kryo kryo, Output output, TriangularFloatDistribution object) { output.writeFloat(object.getLow()); output.writeFloat(object.getHigh()); output.writeFloat(object.getMode()); } @Override public TriangularFloatDistribution read (Kryo kryo, Input input, Class<TriangularFloatDistribution> type) { return new TriangularFloatDistribution(input.readFloat(), input.readFloat(), input.readFloat()); } }); kryo.register(TriangularIntegerDistribution.class, new DistributionSerializer<TriangularIntegerDistribution>() { @Override public void write (Kryo kryo, Output output, TriangularIntegerDistribution object) { output.writeInt(object.getLow()); output.writeInt(object.getHigh()); output.writeFloat(object.getMode()); } @Override public TriangularIntegerDistribution read (Kryo kryo, Input input, Class<TriangularIntegerDistribution> type) { return new TriangularIntegerDistribution(input.readInt(), input.readInt(), input.readFloat()); } }); kryo.register(TriangularLongDistribution.class, new DistributionSerializer<TriangularLongDistribution>() { @Override public void write (Kryo kryo, Output output, TriangularLongDistribution object) { output.writeLong(object.getLow()); output.writeLong(object.getHigh()); output.writeDouble(object.getMode()); } @Override public TriangularLongDistribution read (Kryo kryo, Input input, Class<TriangularLongDistribution> type) { return new TriangularLongDistribution(input.readLong(), input.readLong(), input.readDouble()); } }); kryo.register(UniformDoubleDistribution.class, new DistributionSerializer<UniformDoubleDistribution>() { @Override public void write (Kryo kryo, Output output, UniformDoubleDistribution object) { output.writeDouble(object.getLow()); output.writeDouble(object.getHigh()); } @Override public UniformDoubleDistribution read (Kryo kryo, Input input, Class<UniformDoubleDistribution> type) { return new UniformDoubleDistribution(input.readDouble(), input.readDouble()); } }); kryo.register(UniformFloatDistribution.class, new DistributionSerializer<UniformFloatDistribution>() { @Override public void write (Kryo kryo, Output output, UniformFloatDistribution object) { output.writeFloat(object.getLow()); output.writeFloat(object.getHigh()); } @Override public UniformFloatDistribution read (Kryo kryo, Input input, Class<UniformFloatDistribution> type) { return new UniformFloatDistribution(input.readFloat(), input.readFloat()); } }); kryo.register(UniformIntegerDistribution.class, new DistributionSerializer<UniformIntegerDistribution>() { @Override public void write (Kryo kryo, Output output, UniformIntegerDistribution object) { output.writeInt(object.getLow()); output.writeInt(object.getHigh()); } @Override public UniformIntegerDistribution read (Kryo kryo, Input input, Class<UniformIntegerDistribution> type) { return new UniformIntegerDistribution(input.readInt(), input.readInt()); } }); kryo.register(UniformLongDistribution.class, new DistributionSerializer<UniformLongDistribution>() { @Override public void write (Kryo kryo, Output output, UniformLongDistribution object) { output.writeLong(object.getLow()); output.writeLong(object.getHigh()); } @Override public UniformLongDistribution read (Kryo kryo, Input input, Class<UniformLongDistribution> type) { return new UniformLongDistribution(input.readLong(), input.readLong()); } }); kryo.register(BehaviorTree.class); // FieldSerializer fieldSerializer = new FieldSerializer(kryo, BehaviorTree.class); // fieldSerializer.removeField("object"); // kryo.register(BehaviorTree.class, fieldSerializer); } public static void save (Object obj) { output.clear(); kryo.writeObjectOrNull(output, obj, obj.getClass()); // System.out.println(output.total()); } public static <T> T load (Class<T> type) { Input input = new ByteBufferInput(output.getBuffer()); return kryo.readObjectOrNull(input, type); } public static <T> T copy (T object) { return kryo.copy(object); } static abstract class DistributionSerializer<T extends Distribution> extends Serializer<T> { public DistributionSerializer () { super(false, true); } } }