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);
}
}
}
}
Причину Вам сказал компилятор:
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
}
Ошибку нашел, все было очень просто, клас Gender не был помечен Serialize. Все ссылки сериализуемого класса, должны быть тоже отмечение как сериализуемые.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
мне нужно сделать цикл, который будет длиться 20 секундВсе это время, будет производиться запрос к БД на проверку значения State
Делаю rss-reader, не знаю как привести pubdate к виду которому я хочуПо умолчанию pubdate имеет вид "Tue, 06 Aug 2019 00:00:00 +0300"