public virtual IRoleData ReadSerializedRole(Stream dataStream, string serializedItemId)
        {
            Assert.ArgumentNotNull(dataStream, nameof(dataStream));

            try
            {
                using (var reader = new YamlReader(dataStream, 4096, true))
                {
                    string roleName = reader.ReadExpectedMap("Role");

                    var memberOfRoles = new List<string>();

                    var roleMembershipNode = reader.PeekMap();
                    if (roleMembershipNode.HasValue && roleMembershipNode.Value.Key.Equals("MemberOf"))
                    {
                        reader.ReadMap();
                        while (true)
                        {
                            var memberOfRole = reader.PeekMap();
                            if (!memberOfRole.HasValue || !memberOfRole.Value.Key.Equals("Role", StringComparison.Ordinal)) break;

                            reader.ReadMap();

                            memberOfRoles.Add(memberOfRole.Value.Value);
                        }
                    }

                    return new SerializedRoleData(roleName, memberOfRoles.ToArray(), serializedItemId);
                }
            }
            catch (Exception exception)
            {
                throw new YamlFormatException("Error parsing YAML " + serializedItemId, exception);
            }
        }
        public IItemMetadata ReadSerializedItemMetadata(Stream dataStream, string serializedItemId)
        {
            Assert.ArgumentNotNull(dataStream, "dataStream");

            try
            {
                using (var reader = new YamlReader(dataStream, 4096, true))
                {
                    var item = new YamlItemMetadata();
                    item.ReadYaml(reader, serializedItemId);

                    return(item);
                }
            }
            catch (Exception exception)
            {
                throw new YamlFormatException("Error parsing YAML " + serializedItemId, exception);
            }
        }
        public virtual IItemData ReadSerializedItem(Stream dataStream, string serializedItemId)
        {
            Assert.ArgumentNotNull(dataStream, "dataStream");

            try
            {
                using (var reader = new YamlReader(dataStream, 4096, true))
                {
                    var item = new YamlItem();
                    item.ReadYaml(reader);

                    return(new YamlItemData(item, serializedItemId, FieldFormatters.ToArray(), ParentDataStore));
                }
            }
            catch (Exception exception)
            {
                throw new YamlFormatException("Error parsing YAML " + serializedItemId, exception);
            }
        }
		public IItemMetadata ReadSerializedItemMetadata(Stream dataStream, string serializedItemId)
		{
			Assert.ArgumentNotNull(dataStream, "dataStream");

			try
			{
				using (var reader = new YamlReader(dataStream, 4096, true))
				{
					var item = new YamlItemMetadata();
					item.ReadYaml(reader, serializedItemId);

					return item;
				}
			}
			catch (Exception exception)
			{
				throw new YamlFormatException("Error parsing YAML " + serializedItemId, exception);
			}
		}
		public virtual IItemData ReadSerializedItem(Stream dataStream, string serializedItemId)
		{
			Assert.ArgumentNotNull(dataStream, "dataStream");

			try
			{
				using (var reader = new YamlReader(dataStream, 4096, true))
				{
					var item = new YamlItem();
					item.ReadYaml(reader);

					return new YamlItemData(item, serializedItemId, FieldFormatters.ToArray(), ParentDataStore);
				}
			}
			catch (Exception exception)
			{
				throw new YamlFormatException("Error parsing YAML " + serializedItemId, exception);
			}
		}
        public virtual SyncUser ReadSerializedUser(Stream dataStream, string serializedItemId)
        {
            Assert.ArgumentNotNull(dataStream, nameof(dataStream));

            try
            {
                using (var reader = new YamlReader(dataStream, 4096, true))
                {
                    var user = new SyncUser();

                    user.UserName = reader.ReadExpectedMap("Username");
                    user.Email = reader.ReadExpectedMap("Email");
                    user.Comment = reader.ReadExpectedMap("Comment");
                    user.CreationDate = DateTime.ParseExact(reader.ReadExpectedMap("Created"), "o", CultureInfo.InvariantCulture, DateTimeStyles.None);
                    user.IsApproved = bool.Parse(reader.ReadExpectedMap("IsApproved"));

                    var propertiesNode = reader.PeekMap();
                    if (propertiesNode.HasValue && propertiesNode.Value.Key.Equals("Properties"))
                    {
                        reader.ReadMap();
                        while (true)
                        {
                            var propertyName = reader.PeekMap();

                            if (propertyName == null || !propertyName.Value.Key.Equals("Key")) break;

                            reader.ReadMap();

                            var rawValue = reader.ReadExpectedMap("Value");
                            var valueTypeString = reader.ReadExpectedMap("ValueType");

                            var value = ReadPropertyValueObject(propertyName.Value.Value, valueTypeString, rawValue);

                            bool propertyIsCustom = bool.Parse(reader.ReadExpectedMap("IsCustom"));

                            user.ProfileProperties.Add(new SyncProfileProperty(propertyName.Value.Value, value, propertyIsCustom));
                        }
                    }

                    var rolesNode = reader.PeekMap();

                    if (rolesNode.HasValue && rolesNode.Value.Key.Equals("Roles"))
                    {
                        reader.ReadMap();

                        while (true)
                        {
                            var roleName = reader.ReadMap();

                            if (string.IsNullOrWhiteSpace(roleName?.Value)) break;

                            user.Roles.Add(roleName.Value.Value);
                        }
                    }

                    return user;
                }
            }
            catch (Exception exception)
            {
                throw new YamlFormatException("Error parsing YAML " + serializedItemId, exception);
            }
        }