Example usage for com.google.gwt.user.server.rpc.impl SerializabilityUtil applyFieldSerializationPolicy

List of usage examples for com.google.gwt.user.server.rpc.impl SerializabilityUtil applyFieldSerializationPolicy

Introduction

In this page you can find the example usage for com.google.gwt.user.server.rpc.impl SerializabilityUtil applyFieldSerializationPolicy.

Prototype

public static Field[] applyFieldSerializationPolicy(Class<?> clazz) 

Source Link

Document

Returns the fields of a particular class that can be considered for serialization.

Usage

From source file:com.gdevelop.gwt.syncrpc.SyncClientSerializationStreamReader.java

License:Apache License

private void deserializeClass(Class<?> instanceClass, Object instance) throws SerializationException,
        IllegalAccessException, NoSuchMethodException, InvocationTargetException, ClassNotFoundException {
    Set<String> clientFieldNames = serializationPolicy.getClientFieldNamesForEnhancedClass(instanceClass);
    if (clientFieldNames != null) {
        readString();// and toss...
    }/* w w w .  j ava2  s.  co m*/
    Field[] serializableFields = SerializabilityUtil.applyFieldSerializationPolicy(instanceClass);
    for (Field declField : serializableFields) {
        assert (declField != null);
        Object value = deserializeValue(declField.getType());
        boolean isAccessible = declField.isAccessible();
        boolean needsAccessOverride = !isAccessible && !Modifier.isPublic(declField.getModifiers());
        if (needsAccessOverride) {
            // Override access restrictions
            declField.setAccessible(true);
        }
        declField.set(instance, value);
    }
    Class<?> superClass = instanceClass.getSuperclass();
    if (serializationPolicy.shouldDeserializeFields(superClass)) {
        deserializeImpl(SerializabilityUtil.hasCustomFieldSerializer(superClass), superClass, instance);
    }
}

From source file:com.gdevelop.gwt.syncrpc.SyncClientSerializationStreamWriter.java

License:Apache License

private void serializeClass(Object instance, Class<?> instanceClass) throws SerializationException {
    assert (instance != null);
    Set<String> clientFieldNames = serializationPolicy.getClientFieldNamesForEnhancedClass(instanceClass);
    if (clientFieldNames != null) {
        writeString(null);/*  w w  w .j av  a2 s  . com*/
    }
    Field[] serializableFields = SerializabilityUtil.applyFieldSerializationPolicy(instanceClass);
    for (Field declField : serializableFields) {
        assert (declField != null);

        boolean isAccessible = declField.isAccessible();
        boolean needsAccessOverride = !isAccessible && !Modifier.isPublic(declField.getModifiers());
        if (needsAccessOverride) {
            // Override the access restrictions
            declField.setAccessible(true);
        }

        Object value;
        try {
            value = declField.get(instance);
            serializeValue(value, declField.getType());

        } catch (IllegalArgumentException e) {
            throw new SerializationException(e);

        } catch (IllegalAccessException e) {
            throw new SerializationException(e);
        }
    }

    Class<?> superClass = instanceClass.getSuperclass();
    if (serializationPolicy.shouldSerializeFields(superClass)) {
        serializeImpl(instance, superClass);
    }
}

From source file:com.google.gwt.sample.dynatable.utils.ServerSerializationStreamWriter_2_0_1.java

License:Apache License

private void serializeClass(Object instance, Class<?> instanceClass) throws SerializationException {
    assert (instance != null);
    Field[] serializableFields = SerializabilityUtil.applyFieldSerializationPolicy(instanceClass);

    /**/*  www.j a v  a  2s. co m*/
     * If clientFieldNames is non-null, identify any additional server-only fields and serialize
     * them separately.  Java serialization is used to construct a byte array, which is encoded
     * as a String and written prior to the rest of the field data.
     */
    Set<String> clientFieldNames = serializationPolicy.getClientFieldNamesForEnhancedClass(instanceClass);
    if (clientFieldNames != null) {
        List<Field> serverFields = new ArrayList<Field>();
        for (Field declField : serializableFields) {
            assert (declField != null);

            // Identify server-only fields
            if (!clientFieldNames.contains(declField.getName())) {
                serverFields.add(declField);
                continue;
            }
        }

        // Serialize the server-only fields into a byte array and encode as a String
        try {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            ObjectOutputStream oos = new ObjectOutputStream(baos);
            oos.writeInt(serverFields.size());
            for (Field f : serverFields) {
                oos.writeObject(f.getName());
                f.setAccessible(true);
                Object fieldData = f.get(instance);
                oos.writeObject(fieldData);
            }
            oos.close();

            byte[] serializedData = baos.toByteArray();
            String encodedData = Base64Utils.toBase64(serializedData);
            writeString(encodedData);
        } catch (IllegalAccessException e) {
            throw new SerializationException(e);
        } catch (IOException e) {
            throw new SerializationException(e);
        }
    }

    // Write the client-visible field data
    for (Field declField : serializableFields) {
        if ((clientFieldNames != null) && !clientFieldNames.contains(declField.getName())) {
            // Skip server-only fields
            continue;
        }

        boolean isAccessible = declField.isAccessible();
        boolean needsAccessOverride = !isAccessible && !Modifier.isPublic(declField.getModifiers());
        if (needsAccessOverride) {
            // Override the access restrictions
            declField.setAccessible(true);
        }

        Object value;
        try {
            value = declField.get(instance);
            serializeValue(value, declField.getType());

        } catch (IllegalArgumentException e) {
            throw new SerializationException(e);

        } catch (IllegalAccessException e) {
            throw new SerializationException(e);
        }
    }

    Class<?> superClass = instanceClass.getSuperclass();
    if (serializationPolicy.shouldSerializeFields(superClass)) {
        serializeImpl(instance, superClass);
    }
}

From source file:org.gwtrpc4j.stream.JClientSerializationStreamReader.java

License:Apache License

private void deserializeClass(Class<?> instanceClass, Object instance) throws SerializationException,
        IllegalAccessException, NoSuchMethodException, InvocationTargetException, ClassNotFoundException {
    /**/*ww w  .j  av a2 s. c  o m*/
     * A map from field names to corresponding setter methods. The reference
     * will be null for classes that do not require special handling for
     * server-only fields.
     */
    Map<String, Method> setters = null;

    /**
     * A list of fields of this class known to the client. If null, assume
     * the class is not enhanced and don't attempt to deal with server-only
     * fields.
     */
    Set<String> clientFieldNames = serializationPolicy.getClientFieldNamesForEnhancedClass(instanceClass);
    if (clientFieldNames != null) {
        // Read and set server-only instance fields encoded in the RPC data
        try {
            String encodedData = readString();
            if (encodedData != null) {
                byte[] serializedData = Base64Utils.fromBase64(encodedData);
                ByteArrayInputStream baos = new ByteArrayInputStream(serializedData);
                ObjectInputStream ois = new ObjectInputStream(baos);

                int count = ois.readInt();
                for (int i = 0; i < count; i++) {
                    String fieldName = (String) ois.readObject();
                    Object fieldValue = ois.readObject();
                    Field field = instanceClass.getDeclaredField(fieldName);
                    field.setAccessible(true);
                    field.set(instance, fieldValue);
                }
            }
        } catch (IOException e) {
            throw new SerializationException(e);
        } catch (NoSuchFieldException e) {
            throw new SerializationException(e);
        }

        setters = getSetters(instanceClass);
    }

    Field[] serializableFields = SerializabilityUtil.applyFieldSerializationPolicy(instanceClass);
    for (Field declField : serializableFields) {
        assert declField != null;
        if (clientFieldNames != null && !clientFieldNames.contains(declField.getName())) {
            continue;
        }

        Object value = deserializeValue(declField.getType());

        String fieldName = declField.getName();
        Method setter;
        /*
         * If setters is non-null and there is a setter method for the given
         * field, call the setter. Otherwise, set the field value directly.
         * For persistence APIs such as JDO, the setter methods have been
         * enhanced to manipulate additional object state, causing direct
         * field writes to fail to update the object state properly.
         */
        if (setters != null && (setter = setters.get(fieldName)) != null) {
            setter.invoke(instance, value);
        } else {
            boolean isAccessible = declField.isAccessible();
            boolean needsAccessOverride = !isAccessible && !Modifier.isPublic(declField.getModifiers());
            if (needsAccessOverride) {
                // Override access restrictions
                declField.setAccessible(true);
            }

            declField.set(instance, value);
        }
    }

    Class<?> superClass = instanceClass.getSuperclass();
    if (serializationPolicy.shouldDeserializeFields(superClass)) {
        deserializeImpl(SerializabilityUtil.hasCustomFieldSerializer(superClass), superClass, instance);
    }
}