public JaggedArraySerializer(TypeSerializationMetadata typeMetadata)
            : base(typeMetadata)
        {
            if (typeMetadata != null)
            {
                if (!typeMetadata.cSharpType.GetElementType().IsArray)
                {
                    throw new SerializationException($"Cannot convert {typeMetadata.udonStorageType} to {typeMetadata.cSharpType}");
                }

                if (typeMetadata.arrayElementMetadata == null)
                {
                    throw new ArgumentException("Array element metadata cannot be null on array type metadata");
                }

                rootArraySerializer = CreatePooled(new TypeSerializationMetadata(typeMetadata.arrayElementMetadata.cSharpType.MakeArrayType())
                {
                    arrayElementMetadata = typeMetadata.arrayElementMetadata
                });

                int arrayDepth = 0;

                System.Type arrayType = typeMetadata.cSharpType;
                while (arrayType.IsArray)
                {
                    arrayDepth++;
                    arrayType = arrayType.GetElementType();
                }

                if (arrayDepth <= 1)
                {
                    throw new SerializationException("Jagged array serializer must run on jagged arrays.");
                }
            }
        }
示例#2
0
        public static Serializer CreatePooled(System.Type type)
        {
            lookupPooledTypeData.SetToType(type);

            Serializer serializer;

            if (!typeSerializerDictionary.TryGetValue(lookupPooledTypeData, out serializer))
            {
                TypeSerializationMetadata typeMetadata = new TypeSerializationMetadata(type);
                serializer = Create(typeMetadata);
                typeSerializerDictionary.Add(typeMetadata, serializer);
            }

            return(serializer);
        }
        public void SetToType(System.Type type)
        {
            cSharpType = type;
            if (cSharpType != null && cSharpType.IsArray)
            {
                System.Type elementType = cSharpType;
                while (elementType.IsArray)
                {
                    elementType = elementType.GetElementType();
                }

                arrayElementMetadata = new TypeSerializationMetadata(elementType);
            }

            udonStorageType = UdonSharpUtils.UserTypeToUdonType(cSharpType);
        }
示例#4
0
        private static Serializer Create(TypeSerializationMetadata typeMetadata)
        {
            if (typeMetadata == null)
            {
                throw new System.ArgumentException("Type metadata cannot be null for serializer creation");
            }

            foreach (Serializer checkSerializer in _typeCheckSerializers)
            {
                if (checkSerializer.HandlesTypeSerialization(typeMetadata))
                {
                    return(checkSerializer.MakeSerializer(typeMetadata));
                }
            }

            throw new System.Exception($"Failed to initialize a valid serializer for {typeMetadata}");
        }
示例#5
0
        public static Serializer CreatePooled(TypeSerializationMetadata typeMetadata)
        {
            if (typeMetadata == null)
            {
                throw new System.ArgumentException("Type metadata cannot be null for serializer creation");
            }

            Serializer serializer;

            if (!typeSerializerDictionary.TryGetValue(typeMetadata, out serializer))
            {
                serializer = Create(typeMetadata);
                typeSerializerDictionary.Add(typeMetadata, serializer);
            }

            return(serializer);
        }
示例#6
0
        public static Serializer CreatePooled(System.Type type)
        {
            Serializer serializer;

            lock (_pooledSerializerLock)
            {
                _lookupPooledTypeData.SetToType(type);
                if (!_typeSerializerDictionary.TryGetValue(_lookupPooledTypeData, out serializer))
                {
                    TypeSerializationMetadata typeMetadata = new TypeSerializationMetadata(type);
                    serializer = Create(typeMetadata);
                    _typeSerializerDictionary.Add(typeMetadata, serializer);
                }
            }

            return(serializer);
        }
        public ArraySerializer(TypeSerializationMetadata typeMetadata)
            : base(typeMetadata)
        {
            if (typeMetadata != null)
            {
                if (typeMetadata.arrayElementMetadata == null)
                {
                    throw new ArgumentException("Array element metadata cannot be null on array type metadata");
                }

                elementSerializer = (Serializer <T>)CreatePooled(typeMetadata.arrayElementMetadata);

                // If using the default serializer, we can just copy the array without iterating through each element.
                if (elementSerializer is DefaultSerializer <T> )
                {
                    elementSerializer = null;
                }
            }
        }
示例#8
0
 /// <summary>
 /// Returns true if this serializer should be used for a given type, returns false otherwise.
 /// </summary>
 /// <param name="typeMetadata"></param>
 /// <returns></returns>
 public abstract bool HandlesTypeSerialization(TypeSerializationMetadata typeMetadata);
 public UdonSharpBehaviourSerializer(TypeSerializationMetadata typeMetadata)
     : base(typeMetadata)
 {
 }
 public SystemObjectSerializer(TypeSerializationMetadata typeMetadata)
     : base(typeMetadata)
 {
 }
 public override bool HandlesTypeSerialization(TypeSerializationMetadata typeMetadata)
 {
     VerifyTypeCheckSanity();
     return(typeMetadata.cSharpType == typeof(object));
 }
示例#12
0
 public UnityObjectSerializer(TypeSerializationMetadata typeMetadata)
     : base(typeMetadata)
 {
 }
 protected override bool HandlesTypeSerialization(TypeSerializationMetadata typeMetadata)
 {
     VerifyTypeCheckSanity();
     return(typeMetadata.cSharpType == typeof(UdonSharpBehaviour));
 }
示例#14
0
 public UserEnumSerializer(TypeSerializationMetadata typeMetadata)
     : base(typeMetadata)
 {
 }
示例#15
0
 public override bool HandlesTypeSerialization(TypeSerializationMetadata typeMetadata)
 {
     VerifyTypeCheckSanity();
     return(typeMetadata.cSharpType == typeof(UnityEngine.Object) || typeMetadata.cSharpType.IsSubclassOf(typeof(UnityEngine.Object)));
 }
 public override bool HandlesTypeSerialization(TypeSerializationMetadata typeMetadata)
 {
     VerifyTypeCheckSanity();
     return(typeMetadata.cSharpType.IsArray && !typeMetadata.cSharpType.GetElementType().IsArray);
 }
 public override bool HandlesTypeSerialization(TypeSerializationMetadata typeMetadata)
 {
     return(typeMetadata.cSharpType == typeof(UdonSharpBehaviour) || typeMetadata.cSharpType.IsSubclassOf(typeof(UdonSharpBehaviour)));
 }
示例#18
0
 protected abstract Serializer MakeSerializer(TypeSerializationMetadata typeMetadata);
示例#19
0
 protected Serializer(TypeSerializationMetadata typeMetadata)
 {
     this.typeMetadata = typeMetadata;
 }
示例#20
0
 /// <summary>
 /// Returns true if this serializer should be used for a given type, returns false otherwise.
 /// </summary>
 /// <param name="typeMetadata"></param>
 /// <returns></returns>
 protected abstract bool HandlesTypeSerialization(TypeSerializationMetadata typeMetadata);
示例#21
0
 protected override bool HandlesTypeSerialization(TypeSerializationMetadata typeMetadata)
 {
     VerifyTypeCheckSanity();
     return(true);
 }
示例#22
0
 public DefaultSerializer(TypeSerializationMetadata typeMetadata)
     : base(typeMetadata)
 {
 }
        protected override Serializer MakeSerializer(TypeSerializationMetadata typeMetadata)
        {
            VerifyTypeCheckSanity();

            return((Serializer)System.Activator.CreateInstance(typeof(ArraySerializer <>).MakeGenericType(typeMetadata.cSharpType.GetElementType()), typeMetadata));
        }
示例#24
0
        protected override bool HandlesTypeSerialization(TypeSerializationMetadata typeMetadata)
        {
            VerifyTypeCheckSanity();

            return(typeMetadata.cSharpType.IsEnum && !CompilerUdonInterface.IsExternType(typeMetadata.cSharpType));
        }