Exemple #1
0
 public SerializableObjectListFieldSerializer(ISerializableObjectFieldSerializerFactory factory)
 {
     _itemSerializer   = factory.GetSerializerForType(typeof(T));
     _simpleReferences = !typeof(System.Collections.IList).IsAssignableFrom(typeof(T));
 }
Exemple #2
0
    public SerializedObjectFields(Type t, ISerializableObjectFieldSerializerFactory factory, bool forNetwork)
    {
        if (!typeof(Actor).IsAssignableFrom(t))
        {
            throw new ObjectSerializationException("Type is not a serializable object!");
        }

        for (; t != typeof(object); t = t.BaseType)
        {
            var members = t.GetFields(BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic);

            foreach (var field in members)
            {
                if (field.DeclaringType != t)
                {
                    continue;
                }

                var attributes = System.Attribute.GetCustomAttributes(field);

                if (forNetwork)
                {
                    foreach (var attr in attributes)
                    {
                        var replication = attr as Replicated;
                        if (replication != null)
                        {
                            var serializedField = new FieldSpec();
                            serializedField.field             = field;
                            serializedField.fieldID           = (ushort)++_nextFieldID;
                            serializedField.replication       = replication;
                            serializedField.isObjectReference = typeof(SerializableObject).IsAssignableFrom(field.FieldType);
                            serializedField.serializer        = factory.GetSerializerForField(serializedField);

                            if (replication.Notify != null)
                            {
                                serializedField.onRep = t.GetMethod(replication.Notify, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.ExactBinding, null, System.Type.EmptyTypes, null);
                                if (serializedField.onRep == null)
                                {
                                    throw new MissingMemberException(t.FullName + " is missing replication notification method " + serializedField.onRep + " specified by replicated field " + field.Name);
                                }
                            }

                            _serializedFields.Add(serializedField.fieldID, serializedField);
                        }
                    }
                }
                else
                {
                    bool isTransient = true;
                    foreach (var attr in attributes)
                    {
                        isTransient = !(attr is UnityEngine.SerializeField);
                        if (!isTransient)
                        {
                            break;
                        }
                    }

                    if (!isTransient)
                    {
                        var serializedField = new FieldSpec();
                        serializedField.field             = field;
                        serializedField.fieldID           = (ushort)++_nextFieldID;
                        serializedField.serializer        = factory.GetSerializerForField(serializedField);
                        serializedField.isObjectReference = typeof(SerializableObject).IsAssignableFrom(field.FieldType);
                        _serializedFields.Add(serializedField.fieldID, serializedField);
                    }
                }
            }
        }

        if (_serializedFields.Values.Count > MAX_REPLICATED_FIELDS)
        {
            throw new ObjectSerializationException("Too many replicated fields!");
        }
    }