File: System\Runtime\Serialization\Formatters\Binary\BinaryObjectWithMap.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.Diagnostics;
 
namespace System.Runtime.Serialization.Formatters.Binary
{
    internal sealed class BinaryObjectWithMap : IStreamable
    {
        internal BinaryHeaderEnum _binaryHeaderEnum;
        internal int _objectId;
        internal string? _name;
        internal int _numMembers;
        internal string[]? _memberNames;
        internal int _assemId;
 
        internal BinaryObjectWithMap() { }
 
        internal BinaryObjectWithMap(BinaryHeaderEnum binaryHeaderEnum)
        {
            _binaryHeaderEnum = binaryHeaderEnum;
        }
 
        internal void Set(int objectId, string name, int numMembers, string[] memberNames, int assemId)
        {
            _objectId = objectId;
            _name = name;
            _numMembers = numMembers;
            _memberNames = memberNames;
            _assemId = assemId;
 
            _binaryHeaderEnum = assemId > 0 ?
                BinaryHeaderEnum.ObjectWithMapAssemId :
                BinaryHeaderEnum.ObjectWithMap;
        }
 
        public void Write(BinaryFormatterWriter output)
        {
            Debug.Assert(_name != null && _memberNames != null);
            output.WriteByte((byte)_binaryHeaderEnum);
            output.WriteInt32(_objectId);
            output.WriteString(_name);
 
            output.WriteInt32(_numMembers);
            for (int i = 0; i < _numMembers; i++)
            {
                output.WriteString(_memberNames[i]);
            }
 
            if (_assemId > 0)
            {
                output.WriteInt32(_assemId);
            }
        }
 
        public void Read(BinaryParser input)
        {
            _objectId = input.ReadInt32();
            _name = input.ReadString();
            _numMembers = input.ReadInt32();
 
            _memberNames = new string[_numMembers];
            for (int i = 0; i < _numMembers; i++)
            {
                _memberNames[i] = input.ReadString();
            }
 
            if (_binaryHeaderEnum == BinaryHeaderEnum.ObjectWithMapAssemId)
            {
                _assemId = input.ReadInt32();
            }
        }
    }
}