Ошибка сериализация бинарного файла

97
19 мая 2021, 07:50
System.Runtime.Serialization.SerializationException: 'Type 'FitnesCenter.BL.Model.Gender' in Assembly 'FitnesCenter.BL, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' is not marked as serializable.'  

Ошибка возникает при вызове метода Save(), подскажите в чем причина? Пользователь создаеться без ошибок, а запись не проходит, хотя файл каким то мусором занят.

using System;
namespace FitnesCenter.BL.Model
{
    [Serializable]
    public class User
    {
        /// <summary>
        /// UserName 
        /// </summary>
        public string Name { get; } // Setter не делаю, для того что бы нельзя было поменять имя пользователя
        public Gender Gender { get; }
        public DateTime BirthDate { get; }
        public double Weight { get; set; }
        public double Height { get; set; }
        public User(string name, 
                    Gender gender, 
                    DateTime birthDate, 
                    double weight, 
                    double height)
        {
            #region checkInputParameters
            if (string.IsNullOrWhiteSpace(name))
            {
                throw new ArgumentNullException("Name gender can't be empty or null.", nameof(name));
            }
            if (gender == null)
            {
                throw new ArgumentNullException("Gender can't be empty.", nameof(gender));
            }
            if (birthDate < DateTime.Parse("01.01.1900") ||  birthDate >= DateTime.Now) //TODO : mayby need its write like this - "DateTime.Parse("1900/01/01")" 
            {
                throw new ArgumentException("Impossible date of birth.", nameof(birthDate));
            }
            if(weight <= 0)
            {
                throw new ArgumentException("Weight can't be less than or equal to zero.", nameof(weight));
            }
            if(height <= 0)
            {
                throw new ArgumentException("Height can't be less than or equal to zero.", nameof(height));
            }
            Name = name;
            Gender = gender;
            BirthDate = birthDate;
            Weight = weight;
            Height = height;
            #endregion
        }
        public override string ToString()
        {
            return Name;
        }
    }
}

using System;
namespace FitnesCenter.BL.Model
{
    /// <summary>
    /// Делаю не Enumom что бы удобнее было работать с EntityFramework
    /// </summary>
    public class Gender
    {
        public string Name { get; }
        public Gender(string name)
        {
            if (string.IsNullOrWhiteSpace(name))
            {
                throw new ArgumentNullException("Name gender can't be empty or null.", nameof(name));
            }
            Name = name;
        }
        public override string ToString()
        {
            return Name;
        }
    }
}

using FitnesCenter.BL.Model;
using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.Xml.Serialization;
namespace FitnesCenter.BL.Controller
{
    /// <summary>
    /// User Controller
    /// </summary>
    public class UserController
    {
        public User User { get; } // In it I will write
        /// <summary>
        /// Deserialize
        /// </summary>
        /// <returns>User data</returns>
        public UserController()
        {
            var binFormatter = new BinaryFormatter();
            using (var fs = new FileStream("users.dat", FileMode.OpenOrCreate))
            {
                if (binFormatter.Deserialize(fs) is User user)
                {
                    User = user;
                }
            }
            //TODO: Что делать если пользователя не прочитали
        }
        public UserController(string userName, string genderName, DateTime birthDate, double weight, double height)
        {
            #region checkInputParameters
            if (string.IsNullOrWhiteSpace(userName))
            {
                throw new ArgumentNullException("Name gender can't be empty or null.", nameof(userName));
            }
            if (string.IsNullOrWhiteSpace(genderName))
            {
                throw new ArgumentNullException("Gender can't be empty.", nameof(genderName));
            }
            if (birthDate < DateTime.Parse("01.01.1900") || birthDate >= DateTime.Now) //TODO : mayby need its write like this - "DateTime.Parse("1900/01/01")" 
            {
                throw new ArgumentException("Impossible date of birth.", nameof(birthDate));
            }
            if (weight <= 0)
            {
                throw new ArgumentException("Weight can't be less than or equal to zero.", nameof(weight));
            }
            if (height <= 0)
            {
                throw new ArgumentException("Height can't be less than or equal to zero.", nameof(height));
            }
            #endregion
            var gender = new Gender(genderName);
            var user = new User(userName, gender, birthDate, weight, height);
            //New option
            //User = user ?? throw new ArgumentNullException("User can't be null.", nameof(user));
            //Old School
            if (user == null)
            {
                //Возможно, проверка не требуеться, лишняя... // мы все проверили зареанее!
                throw new ArgumentNullException("User can't be null.", nameof(user));
            }
            User = user;
        }
        /// <summary>
        /// Serialization
        /// </summary>
        /// <returns>True if recording success</returns>
        public void Save() // It's necessary to indicate what we serialize 
        {
            //Serialize User
            //Encrypt file
            BinaryFormatter binFormatter = new BinaryFormatter();
            using (var fs = new FileStream("users.dat", FileMode.OpenOrCreate))
            {
                binFormatter.Serialize(fs, User);
            }
        }
    }
}
Answer 1

Причину Вам сказал компилятор:

System.Runtime.Serialization.SerializationException: 'Type 'FitnesCenter.BL.Model.Gender' in Assembly 'FitnesCenter.BL, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' is not marked as serializable.'

Чтобы объект определенного класса можно было сериализовать, этот класс следует пометить атрибутом Serializable:

[Serializable] <- добавлен аттрибут
public class Gender
{
    // impl
}
Answer 2

Ошибку нашел, все было очень просто, клас Gender не был помечен Serialize. Все ссылки сериализуемого класса, должны быть тоже отмечение как сериализуемые.

READ ALSO
Выполнение цикла определенное время

Выполнение цикла определенное время

мне нужно сделать цикл, который будет длиться 20 секундВсе это время, будет производиться запрос к БД на проверку значения State

88
ASP.NET Core PostgreSQL

ASP.NET Core PostgreSQL

Пытаюсь установить PostgreSQL в проект ASPNET Core

144
как привести к нормальному виду pubdate в rss-reader

как привести к нормальному виду pubdate в rss-reader

Делаю rss-reader, не знаю как привести pubdate к виду которому я хочуПо умолчанию pubdate имеет вид "Tue, 06 Aug 2019 00:00:00 +0300"

356
NUnit игнорирует тесты, не запускаем мои тесты

NUnit игнорирует тесты, не запускаем мои тесты

Создал новый проект установил NUnit 312

108