From f3eb1b4383848e28447717502083439d9e0dc0b7 Mon Sep 17 00:00:00 2001 From: Artur Signell Date: Fri, 9 Oct 2015 23:44:47 +0300 Subject: Do not modify state while serializing (#19090) Serializing an object should never modify its internal state. It should be possible to serialize an object multiple times and get the same result Change-Id: I983e2eec1b3fb374bf40f150bdb9918ac5791d62 --- server/src/com/vaadin/server/ClientMethodInvocation.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) (limited to 'server/src/com/vaadin') diff --git a/server/src/com/vaadin/server/ClientMethodInvocation.java b/server/src/com/vaadin/server/ClientMethodInvocation.java index 33b88a168b..77849c83df 100644 --- a/server/src/com/vaadin/server/ClientMethodInvocation.java +++ b/server/src/com/vaadin/server/ClientMethodInvocation.java @@ -38,7 +38,7 @@ public class ClientMethodInvocation implements Serializable, private final ClientConnector connector; private final String interfaceName; private final String methodName; - private final Object[] parameters; + private transient Object[] parameters; private Type[] parameterTypes; // used for sorting calls between different connectors in the same UI @@ -102,6 +102,7 @@ public class ClientMethodInvocation implements Serializable, // that is Serializable. On deserialization (readObject-method below) // the process should be reversed. + Object[] serializedParameters = new Object[parameters.length]; // Easy way for implementing serialization & deserialization is by // writing/parsing the object's content as string. for (int i = 0; i < parameterTypes.length; i++) { @@ -109,12 +110,15 @@ public class ClientMethodInvocation implements Serializable, if (type instanceof Class) { Class clazz = (Class) type; if (JsonArray.class.isAssignableFrom(clazz)) { - parameters[i] = JsonUtil + serializedParameters[i] = JsonUtil .stringify((JsonArray) parameters[i]); + } else { + serializedParameters[i] = parameters[i]; } } } stream.defaultWriteObject(); + stream.writeObject(serializedParameters); } private void readObject(ObjectInputStream stream) throws IOException, @@ -122,6 +126,7 @@ public class ClientMethodInvocation implements Serializable, // Reverses the serialization done in writeObject. Basically just // parsing the serialized type back to the non-serializable type. stream.defaultReadObject(); + parameters = (Object[]) stream.readObject(); for (int i = 0; i < parameterTypes.length; i++) { Type type = parameterTypes[i]; if (type instanceof Class) { -- cgit v1.2.3