public SerializableObjectListFieldSerializer(ISerializableObjectFieldSerializerFactory factory) { _itemSerializer = factory.GetSerializerForType(typeof(T)); _simpleReferences = !typeof(System.Collections.IList).IsAssignableFrom(typeof(T)); }
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!"); } }