public void Write(T model)
        {
            var fieldList = FixedLengthFieldHelper.GetFixedLengthFieldList <T>(true);

            foreach (var field in fieldList)
            {
                var value = field.GetValue(model);
                if (value == null)
                {
                    throw new InvalidDataException($"The value of {field.TypeString} '{field.Name}' cannot be null.");
                }

                var length = FixedLengthFieldHelper.GetFieldLength(field);
                var buffer = FixedLengthFieldHelper.ValueToBytes(value, field);

                if (length < buffer.Length)
                {
                    throw new InvalidDataException($"The value size of {field.TypeString} '{field.Name}' exceeds " +
                                                   $"the specific {field.TypeString} length: {length}.");
                }

                _fileStream.Write(buffer, 0, buffer.Length);

                if (length > buffer.Length)
                {
                    Debug.WriteLine($"The value size of {field.TypeString} '{field.Name}' is smaller than " +
                                    $"the specific {field.TypeString} length {length}. Written bytes will be padded.");

                    // pad with '\0'
                    buffer = new byte[length - buffer.Length];
                    _fileStream.Write(buffer, 0, buffer.Length);
                }
            }
        }
예제 #2
0
        public T Read()
        {
            bool   isValueType = typeof(T).IsValueType;
            var    rawModel    = new T();
            object model       = rawModel;

            var fieldList = FixedLengthFieldHelper.GetFixedLengthFieldList <T>();

            if (isValueType)
            {
                model = rawModel as ValueType;
            }

            var basePos = _fileStream.Position;
            var lastPos = _fileStream.Position;

            foreach (var field in fieldList)
            {
                var offset = field.Offset;
                if (offset == -1)
                {
                    if (_fileStream.Position != lastPos)
                    {
                        _fileStream.Seek(lastPos, SeekOrigin.Begin);
                    }
                }
                else
                {
                    _fileStream.Seek(basePos + offset, SeekOrigin.Begin);
                }

                var length = FixedLengthFieldHelper.GetFieldLength(field);

                if (_buffer.Length < length)
                {
                    _buffer = new byte[length];
                }
                _fileStream.Read(_buffer, 0, length);

                if (offset == -1)
                {
                    lastPos = _fileStream.Position;
                }

                var val = FixedLengthFieldHelper.BytesToValue(_buffer, field);
                if (val == null)
                {
                    throw new InvalidDataException($"The value of {field.TypeString} '{field.Name}' cannot be null.");
                }

                field.SetValue(model, val);
            }

            _fileStream.Seek(lastPos, SeekOrigin.Begin);

            if (isValueType)
            {
                rawModel = (T)model;
            }

            return(rawModel);
        }