Example #1
0
        private object ReadTypeInternal(BinaryReaderX br, Type readType, ValueStorage storage, FieldInfo fieldInfo = null, bool isTypeChosen = false)
        {
            var typeAttributes  = new MemberAttributeInfo(readType);
            var fieldAttributes = fieldInfo == null ? null : new MemberAttributeInfo(fieldInfo);

            var bkByteOrder = br.ByteOrder;
            var bkBitOrder  = br.BitOrder;
            var bkBlockSize = br.BlockSize;

            br.ByteOrder = fieldAttributes?.EndiannessAttribute?.ByteOrder ??
                           typeAttributes.EndiannessAttribute?.ByteOrder ??
                           br.ByteOrder;

            object returnValue;

            if (IsTypeChoice(fieldAttributes) && !isTypeChosen)
            {
                var chosenType = ChooseType(readType, fieldAttributes, storage);
                returnValue = ReadTypeInternal(br, chosenType, storage, fieldInfo, true);
            }
            else if (readType.IsPrimitive)
            {
                returnValue = ReadTypePrimitive(br, readType);
            }
            else if (readType == typeof(string))
            {
                returnValue = ReadTypeString(br, fieldAttributes, storage);
            }
            else if (readType == typeof(decimal))
            {
                returnValue = br.ReadDecimal();
            }
            else if (Tools.IsList(readType))
            {
                returnValue = ReadTypeList(br, readType, fieldAttributes, storage, fieldInfo?.Name);
            }
            else if (readType.IsClass || Tools.IsStruct(readType))
            {
                returnValue = ReadTypeClass(br, readType, storage.CreateScope(fieldInfo?.Name));
            }
            else if (readType.IsEnum)
            {
                returnValue = ReadTypeInternal(br, readType.GetEnumUnderlyingType(), storage);
            }
            else
            {
                throw new UnsupportedTypeException(readType);
            }

            br.ByteOrder = bkByteOrder;
            br.BitOrder  = bkBitOrder;
            br.BlockSize = bkBlockSize;

            return(returnValue);
        }
Example #2
0
        private void WriteTypeInternal(BinaryWriterX bw, object writeValue, ValueStorage storage, FieldInfo fieldInfo = null, bool isTypeChose = false)
        {
            var writeType       = writeValue.GetType();
            var typeAttributes  = new MemberAttributeInfo(writeType);
            var fieldAttributes = fieldInfo == null ? null : new MemberAttributeInfo(fieldInfo);

            var bkByteOrder = bw.ByteOrder;
            var bkBitOrder  = bw.BitOrder;
            var bkBlockSize = bw.BlockSize;

            bw.ByteOrder = fieldAttributes?.EndiannessAttribute?.ByteOrder ??
                           typeAttributes.EndiannessAttribute?.ByteOrder ??
                           bw.ByteOrder;

            if (writeType.IsPrimitive)
            {
                WriteTypePrimitive(bw, writeValue, writeType);
            }
            else if (writeType == typeof(string))
            {
                WriteTypeString(bw, (string)writeValue, fieldAttributes, storage);
            }
            else if (writeType == typeof(decimal))
            {
                bw.Write((decimal)writeValue);
            }
            else if (Tools.IsList(writeType))
            {
                WriteTypeList(bw, (IList)writeValue, fieldAttributes, storage);
            }
            else if (writeType.IsClass || Tools.IsStruct(writeType))
            {
                WriteTypeClass(bw, writeValue, writeType, storage.CreateScope(fieldInfo?.Name));
            }
            else if (writeType.IsEnum)
            {
                var underlyingType = (writeType as TypeInfo)?.DeclaredFields.ToList()[0];
                WriteTypeInternal(bw, underlyingType?.GetValue(writeValue), storage);
            }
            else
            {
                throw new UnsupportedTypeException(writeType);
            }

            bw.ByteOrder = bkByteOrder;
            bw.BitOrder  = bkBitOrder;
            bw.BlockSize = bkBlockSize;
        }
Example #3
0
        private object ReadTypeList(BinaryReaderX br, Type readType, MemberAttributeInfo fieldAttributes, ValueStorage storage, string listFieldName)
        {
            var attributeValues = GetLengthAttributeValues(fieldAttributes, storage);

            if (!attributeValues.HasValue)
            {
                return(null);
            }

            var(length, _) = attributeValues.Value;

            IList list;
            Type  elementType;

            if (readType.IsArray)
            {
                elementType = readType.GetElementType();
                list        = Array.CreateInstance(elementType, length);
            }
            else
            {
                elementType = readType.GetGenericArguments()[0];
                list        = (IList)Activator.CreateInstance(readType);
            }

            for (var i = 0; i < length; i++)
            {
                var elementValue = ReadTypeInternal(br, elementType, storage.CreateScope($"{listFieldName}[{i}]"));
                if (list.IsFixedSize)
                {
                    list[i] = elementValue;
                }
                else
                {
                    list.Add(elementValue);
                }
            }

            return(list);
        }
Example #4
0
        private void WriteTypeList(BinaryWriterX bw, IList writeValue, MemberAttributeInfo fieldAttributes, ValueStorage storage)
        {
            var attributeValues = GetLengthAttributeValues(fieldAttributes, storage);

            if (!attributeValues.HasValue)
            {
                return;
            }

            var(length, _) = attributeValues.Value;

            if (writeValue.Count != length)
            {
                throw new FieldLengthMismatchException(writeValue.Count, length);
            }

            var listCounter = 0;

            foreach (var element in writeValue)
            {
                WriteTypeInternal(bw, element, storage.CreateScope($"[{listCounter++}]"));
            }
        }