Exemple #1
0
        public void Test()
        {
            var thingy = EmptyImplementations.GetEmptyImplementation <ITestInterface>();

            thingy.Method1();

            var resultA = thingy.MethodA();
            var resultB = thingy.MethodB();
            var resultC = thingy.MethodC();
            var resultD = thingy.MethodD();
            var resultE = thingy.MethodE();
            var resultF = thingy.MethodF();
            var resultG = thingy.MethodG();
            var resultH = thingy.MethodH();
            var resultI = thingy.MethodI();
            var resultJ = thingy.MethodJ();
            var resultK = thingy.MethodK();
            var resultL = thingy.MethodL();
            var resultM = thingy.MethodM();
            var resultN = thingy.MethodN();
            var resultO = thingy.MethodO();
            var resultP = thingy.MethodP();
            var resultQ = thingy.MethodQ();
            var resultR = thingy.MethodR();
            var resultS = thingy.MethodS();

            Assert.AreEqual(default, resultA);
Exemple #2
0
        private object FromBytes(ref ByteReader reader, SerializerTypeDetails typeDetail, bool nullFlags, bool drainBytes)
        {
            if (!drainBytes && typeDetail == null)
            {
                throw new NotSupportedException("Cannot deserialize without type information");
            }
            if (includePropertyTypes)
            {
                string typeName      = reader.ReadString(false);
                var    typeFromBytes = Discovery.GetTypeFromName(typeName);
                //overrides potentially boxed type with actual type if exists in assembly
                if (typeFromBytes != null)
                {
                    var newTypeDetail = GetTypeInformation(typeFromBytes, this.indexSize, this.ignoreIndexAttribute);

                    var typeDetailCheck = typeDetail.TypeDetail;
                    if (typeDetailCheck.IsNullable)
                    {
                        typeDetailCheck = typeDetailCheck.InnerTypeDetails[0];
                    }
                    var newTypeDetailCheck = newTypeDetail.TypeDetail;

                    if (newTypeDetailCheck.Type != typeDetailCheck.Type && !newTypeDetailCheck.Interfaces.Contains(typeDetailCheck.Type) && !newTypeDetail.TypeDetail.BaseTypes.Contains(typeDetailCheck.Type))
                    {
                        throw new NotSupportedException($"{newTypeDetail.Type.GetNiceName()} does not convert to {typeDetail.TypeDetail.Type.GetNiceName()}");
                    }

                    typeDetail = newTypeDetail;
                }
            }
            else if (typeDetail.Type.IsInterface && !typeDetail.TypeDetail.IsIEnumerableGeneric)
            {
                var emptyImplementationType = EmptyImplementations.GetEmptyImplementationType(typeDetail.Type);
                typeDetail = GetTypeInformation(emptyImplementationType, this.indexSize, this.ignoreIndexAttribute);
            }

            if (typeDetail.TypeDetail.CoreType.HasValue)
            {
                return(FromBytesCoreType(ref reader, typeDetail.TypeDetail.CoreType.Value, nullFlags));
            }

            if (typeDetail.TypeDetail.EnumUnderlyingType.HasValue)
            {
                var    numValue = FromBytesCoreType(ref reader, typeDetail.TypeDetail.EnumUnderlyingType.Value, nullFlags);
                object value;
                if (!typeDetail.TypeDetail.IsNullable)
                {
                    value = Enum.ToObject(typeDetail.Type, numValue);
                }
                else if (numValue != null)
                {
                    value = Enum.ToObject(typeDetail.TypeDetail.InnerTypes[0], numValue);
                }
                else
                {
                    value = null;
                }
                return(value);
            }

            if (typeDetail.TypeDetail.SpecialType.HasValue || typeDetail.TypeDetail.IsNullable && typeDetail.InnerTypeDetail.TypeDetail.SpecialType.HasValue)
            {
                return(FromBytesSpecialType(ref reader, typeDetail, nullFlags));
            }

            if (typeDetail.TypeDetail.IsIEnumerableGeneric)
            {
                var enumerable = FromBytesEnumerable(ref reader, typeDetail.InnerTypeDetail, !typeDetail.TypeDetail.Type.IsArray && typeDetail.TypeDetail.IsIList);
                return(enumerable);
            }

            if (nullFlags)
            {
                var hasObject = reader.ReadBoolean();

                if (!hasObject)
                {
                    return(null);
                }
            }

            object obj = typeDetail.TypeDetail.Creator();

            for (; ;)
            {
                SerializerMemberDetails indexProperty = null;

                if (usePropertyNames)
                {
                    string name = reader.ReadString(false);

                    if (name == String.Empty)
                    {
                        return(obj);
                    }

                    indexProperty = typeDetail.IndexedProperties.Values.FirstOrDefault(x => x.Name == name);

                    if (indexProperty == null)
                    {
                        if (!usePropertyNames && !includePropertyTypes)
                        {
                            throw new Exception($"Cannot deserialize with property {name} undefined and no types.");
                        }

                        //consume bytes but object does not have property
                        object value = FromBytes(ref reader, null, false, true);
                        indexProperty.Setter(obj, value);
                    }
                    else
                    {
                        object value = FromBytes(ref reader, indexProperty.SerailzierTypeDetails, false, false);
                        indexProperty.Setter(obj, value);
                    }
                }
                else
                {
                    var propertyIndex = this.indexSize switch
                    {
                        ByteSerializerIndexSize.Byte => (ushort)reader.ReadByte(),
                        ByteSerializerIndexSize.UInt16 => reader.ReadUInt16(),
                        _ => throw new NotImplementedException(),
                    };

                    if (propertyIndex == endObjectFlagUShort)
                    {
                        return(obj);
                    }

                    if (typeDetail.IndexedProperties.Keys.Contains(propertyIndex))
                    {
                        indexProperty = typeDetail.IndexedProperties[propertyIndex];
                    }

                    if (indexProperty == null)
                    {
                        if (!usePropertyNames && !includePropertyTypes)
                        {
                            throw new Exception($"Cannot deserialize with property {propertyIndex} undefined and no types.");
                        }

                        //consume bytes but object does not have property
                        object value = FromBytes(ref reader, null, false, true);
                        indexProperty.Setter(obj, value);
                    }
                    else
                    {
                        object value = FromBytes(ref reader, indexProperty.SerailzierTypeDetails, false, false);
                        indexProperty.Setter(obj, value);
                    }
                }
            }

            throw new Exception("Expected end of object marker");
        }