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); } } }
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); }