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