Я реализую идентификатор ASP.NET в системе, в которой использовалась аутентификация с моделью пользователей с платформой Entity Framework и контролируется в WebApp по сеансу (да, это устаревшая система в веб-формы), мы внедрили, заменили модель User
на ApplicationUser
Identity, все работает нормально.«Microsoft.AspNet.Identity.EntityFramework.IdentityUser» не помечен как сериализуемый
Проблема заключается в том, существует система оповещения, которая в основном многие ко многим отношений между Notification
и User
модели, эти уведомления сохраняются в SQL Server вместе с остальной частью системы, но и в Cache Redis для более быстрого чтения и должен быть сериализован для записи на нем. Мы удаляем модель User
, а затем добавили ICollection
из ApplicationUser
в модель Notification
и наоборот, что делает связь между обоими.
Но ApplicationUser
наследует от IdentityUser
, и даже добавление аннотаций [Serializable]
я получаю исключение:
Тип 'Microsoft.AspNet.Identity.EntityFramework.IdentityUser' сборки «Microsoft.AspNet.Identity.EntityFramework , Version = 2.0.0.0, Culture = нейтрально, PublicKeyToken = 31bf3856ad364e35' не отмечен как сериализуемый
Мой вопрос, есть ли способ сериализации это? Или мне придется создать другую модель пользователя только для связи с моделью уведомлений?
ApplicationUser
Модель
[Serializable]
public class ApplicationUser : IdentityUser
{
public ApplicationUser()
{
this.Notificacoes = new List<Notificacao>();
}
public ClaimsIdentity GenerateUserIdentity(IdentityConfig.ApplicationUserManager manager)
{
var userIdentity = manager.CreateIdentity(this, DefaultAuthenticationTypes.ApplicationCookie);
return userIdentity;
}
public Task<ClaimsIdentity> GenerateUserIdentityAsync(IdentityConfig.ApplicationUserManager manager)
{
return Task.FromResult(GenerateUserIdentity(manager));
}
public bool ReceiveNotifications { get; set; }
public int Permission { get; set; }
public virtual ICollection<Notificacao> Notificacoes { get; set; }
}
Notification
Модель
[Serializable]
public partial class Notificacao
{
public Notificacao()
{
this.Usuarios = new List<ApplicationUser>();
}
public int Codigo { get; set; }
public string Mensagem { get; set; }
public DateTime DataHoraNotificacao { get; set; }
public int Tipo { get; set; }
public virtual ICollection<ApplicationUser> Usuarios { get; set; }
}
Сериализация Метод, используемый для сериализации объекта к Redis (где он выбрасывает исключение)
static byte[] Serialize(object o)
{
if (o == null)
{
return null;
}
BinaryFormatter binaryFormatter = new BinaryFormatter();
using (MemoryStream memoryStream = new MemoryStream())
{
binaryFormatter.Serialize(memoryStream, o);
byte[] objectDataAsStream = memoryStream.ToArray();
return objectDataAsStream;
}
}
Он не отмечен как Serializable, вы можете посмотреть на исходный код: https://aspnetidentity.codeplex.com/SourceControl/latest#src/Microsoft.AspNet.Identity.EntityFramework/IdentityUser.cs –
хмм я вижу, ну, я сделаю дециклонное предложение, спасибо! – feliperochadev