private void ReadProperty(int index, out IProperty property, out object?value)
        {
            var isDefaultValue = (index & BinaryEntityEntry.DefaultValueFlag) == BinaryEntityEntry.DefaultValueFlag;

            if (isDefaultValue)
            {
                index &= ~BinaryEntityEntry.DefaultValueFlag;
            }

            index    = BinaryEntityEntry.DecodePropertyIndex(index);
            property = EnsureEntityType( ).FindProperty(index);

            if (!isDefaultValue)
            {
                value = Reader.Read(Nullable.GetUnderlyingType(property.ClrType) ?? property.ClrType);
            }
            else
            {
                value = property.GetDefaultValue( );
            }
        }
        public bool ReadNavigationState([NotNullWhen(true)] out INavigation?navigated)
        {
            navigated = null;

            if (Navigation != null)
            {
                if (Navigation.MoveNext( ))
                {
                    navigated = Navigation.Current;
                    return(true);
                }
                else
                {
                    return(false);
                }
            }

            if (ReadIndex == null)
            {
                ReadIndex = Reader.Read <int> ( );
            }

            var index = ReadIndex.Value;

            if (index == BinaryEntityEntry.EndMarker)
            {
                return(false);
            }
            if (index != BinaryEntityEntry.NavigationMarker)
            {
                throw new InvalidOperationException( );
            }

            var navigation = Reader.Read <byte []> ( );

            if (navigation == null)
            {
                throw new InvalidOperationException( );
            }

            var navigations = new List <INavigation> ( );

            for (var block = 0; block < navigation.Length; block++)
            {
                var bits = navigation [block];
                for (var bit = 0; bit < 8; bit++)
                {
                    var shift = 1 << bit;
                    if ((bits & shift) == shift)
                    {
                        var navigationIndex = BinaryEntityEntry.DecodeNavigationIndex(block * 8 + bit);

                        navigations.Add(EnsureEntityType( ).FindNavigation(navigationIndex));
                    }
                }
            }

            Navigation = navigations.GetEnumerator( );

            return(ReadNavigationState(out navigated));
        }