File: System\Runtime\Serialization\Formatters\Binary\SerializationHeaderRecord.cs
Web Access
Project: src\src\libraries\System.Runtime.Serialization.Formatters\src\System.Runtime.Serialization.Formatters.csproj (System.Runtime.Serialization.Formatters)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Buffers.Binary;
using System.IO;
 
namespace System.Runtime.Serialization.Formatters.Binary
{
    // The Following classes read and write the binary records
    internal sealed class SerializationHeaderRecord : IStreamable
    {
        internal const int BinaryFormatterMajorVersion = 1;
        internal const int BinaryFormatterMinorVersion = 0;
 
        internal BinaryHeaderEnum _binaryHeaderEnum;
        internal int _topId;
        internal int _headerId;
        internal int _majorVersion;
        internal int _minorVersion;
 
        internal SerializationHeaderRecord() { }
 
        internal SerializationHeaderRecord(BinaryHeaderEnum binaryHeaderEnum, int topId, int headerId, int majorVersion, int minorVersion)
        {
            _binaryHeaderEnum = binaryHeaderEnum;
            _topId = topId;
            _headerId = headerId;
            _majorVersion = majorVersion;
            _minorVersion = minorVersion;
        }
 
        public void Write(BinaryFormatterWriter output)
        {
            _majorVersion = BinaryFormatterMajorVersion;
            _minorVersion = BinaryFormatterMinorVersion;
            output.WriteByte((byte)_binaryHeaderEnum);
            output.WriteInt32(_topId);
            output.WriteInt32(_headerId);
            output.WriteInt32(BinaryFormatterMajorVersion);
            output.WriteInt32(BinaryFormatterMinorVersion);
        }
 
        private static int GetInt32(byte[] buffer, int index) =>
            BinaryPrimitives.ReadInt32LittleEndian(buffer.AsSpan(index));
 
        public void Read(BinaryParser input)
        {
            byte[] headerBytes = input.ReadBytes(17);
 
            // Throw if we couldnt read header bytes
            if (headerBytes.Length < 17)
            {
                throw new EndOfStreamException(SR.IO_EOF_ReadBeyondEOF);
            }
 
            _majorVersion = GetInt32(headerBytes, 9);
            if (_majorVersion > BinaryFormatterMajorVersion)
            {
                throw new SerializationException(SR.Format(SR.Serialization_InvalidFormat, BitConverter.ToString(headerBytes)));
            }
 
            // binaryHeaderEnum has already been read
            _binaryHeaderEnum = (BinaryHeaderEnum)headerBytes[0];
            _topId = GetInt32(headerBytes, 1);
            _headerId = GetInt32(headerBytes, 5);
            _minorVersion = GetInt32(headerBytes, 13);
        }
    }
}