Serialize byte arrays sent through rpc as unsigned numbers.

This commit is contained in:
Florian Nücke
2021-06-06 13:41:20 +02:00
parent e338fed9d7
commit c1920c5245
2 changed files with 22 additions and 0 deletions

View File

@@ -11,6 +11,7 @@ import li.cil.oc2.api.bus.device.rpc.RPCParameter;
import li.cil.oc2.common.Constants;
import li.cil.oc2.common.bus.device.rpc.RPCDeviceList;
import li.cil.oc2.common.bus.device.rpc.RPCMethodParameterTypeAdapters;
import li.cil.oc2.common.serialization.serializers.UnsignedByteArrayJsonSerializer;
import li.cil.oc2.common.serialization.serializers.MessageJsonDeserializer;
import li.cil.oc2.common.serialization.serializers.MethodInvocationJsonDeserializer;
import li.cil.oc2.common.serialization.serializers.RPCDeviceWithIdentifierJsonSerializer;
@@ -62,6 +63,7 @@ public final class RPCDeviceBusAdapter implements Steppable {
this.serialDevice = serialDevice;
this.transmitBuffer = ByteBuffer.allocate(maxMessageSize);
this.gson = RPCMethodParameterTypeAdapters.beginBuildGson()
.registerTypeAdapter(byte[].class, new UnsignedByteArrayJsonSerializer())
.registerTypeAdapter(MethodInvocation.class, new MethodInvocationJsonDeserializer())
.registerTypeAdapter(Message.class, new MessageJsonDeserializer())
.registerTypeAdapter(RPCDeviceWithIdentifier.class, new RPCDeviceWithIdentifierJsonSerializer())

View File

@@ -0,0 +1,20 @@
package li.cil.oc2.common.serialization.serializers;
import com.google.gson.*;
import java.lang.reflect.Type;
public final class UnsignedByteArrayJsonSerializer implements JsonSerializer<byte[]> {
@Override
public JsonElement serialize(final byte[] src, final Type typeOfSrc, final JsonSerializationContext context) {
if (src == null) {
return JsonNull.INSTANCE;
}
final JsonArray json = new JsonArray();
for (final byte b : src) {
json.add(b & 0xFF);
}
return json;
}
}