From 5012b2d3ddebcd9b8dfd30c6c21e94c69c07fda9 Mon Sep 17 00:00:00 2001 From: "PSp..om" Date: Sat, 26 Mar 2011 22:44:09 +0000 Subject: [PATCH] Use an extra byte per final-typed field to handle the case of nulls. Note: this is specific to serialized objects and is therefore not adding a byte to things like Strings or arrays... those will have to be reviewed separately. git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@7119 75d07b2b-3a1a-0410-a2c5-0572b91ccdca --- .../com/jme3/network/serializing/Serializer.java | 2 +- .../serializing/serializers/FieldSerializer.java | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/engine/src/networking/com/jme3/network/serializing/Serializer.java b/engine/src/networking/com/jme3/network/serializing/Serializer.java index d17946155..5b33f53a3 100644 --- a/engine/src/networking/com/jme3/network/serializing/Serializer.java +++ b/engine/src/networking/com/jme3/network/serializing/Serializer.java @@ -132,7 +132,7 @@ public abstract class Serializer { Serializable serializable = (Serializable)cls.getAnnotation(Serializable.class); Class serializerClass = serializable.serializer(); - short classId = serializable.id(); + short classId = serializable.id(); if (classId == 0) classId = --nextId; Serializer serializer = getSerializer(serializerClass); diff --git a/engine/src/networking/com/jme3/network/serializing/serializers/FieldSerializer.java b/engine/src/networking/com/jme3/network/serializing/serializers/FieldSerializer.java index 742e5c45c..8e9565b2b 100644 --- a/engine/src/networking/com/jme3/network/serializing/serializers/FieldSerializer.java +++ b/engine/src/networking/com/jme3/network/serializing/serializers/FieldSerializer.java @@ -88,6 +88,11 @@ public class FieldSerializer extends Serializer { } public T readObject(ByteBuffer data, Class c) throws IOException { + + // Read the null/non-null marker + if (data.get() == 0x0) + return null; + SavedField[] fields = savedFields.get(c); T object; @@ -117,6 +122,14 @@ public class FieldSerializer extends Serializer { } public void writeObject(ByteBuffer buffer, Object object) throws IOException { + + // Add the null/non-null marker + buffer.put( (byte)(object != null ? 0x1 : 0x0) ); + if (object == null) { + // Nothing left to do + return; + } + SavedField[] fields = savedFields.get(object.getClass()); if (fields == null) throw new IOException("The " + object.getClass() + " is not registered"