/// <summary> /// Serializes using a <see cref="BinaryWriter"/> /// </summary> /// <param name="writer">the <see cref="BinaryWriter"/> to use for data storage.</param> /// <param name="userData">additional data provided by derived type.</param> /// <exception cref="ArgumentNullException">if 'writer' is null.</exception> protected virtual void WriteTo(BinaryWriter writer, byte[] userData) { if (writer == null) { throw new ArgumentNullException(nameof(writer)); } int numberOfPropertiesWritten = 0; var mask = SerializationMask.None; if (_authenticationType != null) { mask |= SerializationMask.AuthenticationType; numberOfPropertiesWritten++; } if (_bootstrapContext != null) { string rawData = _bootstrapContext as string; if (rawData != null) { mask |= SerializationMask.BootstrapConext; numberOfPropertiesWritten++; } } if (!string.Equals(_nameClaimType, ClaimsIdentity.DefaultNameClaimType, StringComparison.Ordinal)) { mask |= SerializationMask.NameClaimType; numberOfPropertiesWritten++; } if (!string.Equals(_roleClaimType, ClaimsIdentity.DefaultRoleClaimType, StringComparison.Ordinal)) { mask |= SerializationMask.RoleClaimType; numberOfPropertiesWritten++; } if (!string.IsNullOrWhiteSpace(_label)) { mask |= SerializationMask.HasLabel; numberOfPropertiesWritten++; } if (_instanceClaims.Count > 0) { mask |= SerializationMask.HasClaims; numberOfPropertiesWritten++; } if (_actor != null) { mask |= SerializationMask.Actor; numberOfPropertiesWritten++; } if (userData != null && userData.Length > 0) { numberOfPropertiesWritten++; mask |= SerializationMask.UserData; } writer.Write((int)mask); writer.Write(numberOfPropertiesWritten); if ((mask & SerializationMask.AuthenticationType) == SerializationMask.AuthenticationType) { writer.Write(_authenticationType); } if ((mask & SerializationMask.BootstrapConext) == SerializationMask.BootstrapConext) { writer.Write(_bootstrapContext as string); } if ((mask & SerializationMask.NameClaimType) == SerializationMask.NameClaimType) { writer.Write(_nameClaimType); } if ((mask & SerializationMask.RoleClaimType) == SerializationMask.RoleClaimType) { writer.Write(_roleClaimType); } if ((mask & SerializationMask.HasLabel) == SerializationMask.HasLabel) { writer.Write(_label); } if ((mask & SerializationMask.HasClaims) == SerializationMask.HasClaims) { writer.Write(_instanceClaims.Count); foreach (var claim in _instanceClaims) { claim.WriteTo(writer); } } if ((mask & SerializationMask.Actor) == SerializationMask.Actor) { _actor.WriteTo(writer); } if ((mask & SerializationMask.UserData) == SerializationMask.UserData) { writer.Write(userData.Length); writer.Write(userData); } writer.Flush(); }