1

Я реализую идентификатор 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; 
    } 
} 
+0

Он не отмечен как Serializable, вы можете посмотреть на исходный код: https://aspnetidentity.codeplex.com/SourceControl/latest#src/Microsoft.AspNet.Identity.EntityFramework/IdentityUser.cs –

+0

хмм я вижу, ну, я сделаю дециклонное предложение, спасибо! – feliperochadev

ответ

1

Вы не хотите сериализовать IdentityUser или любой из его суб- классов в базу данных. Период.

Если вам нужно поддерживать отношения в базе данных, создайте POCO (Обычный объект CLR - простыми словами, пользовательский класс).

Кроме того, если вам нужно носить с IdentityUser в классе пользователя, используйте композицию вместо наследования. Это означает, что не наследуйте от IdentityUser, но создайте его свойство в своем классе. И отметьте это свойство как NonSerializable.

+0

Понял, я сделаю это, спасибо! – feliperochadev

1

Поскольку у вас нет контроля над сборкой, содержащей класс IdentityUser, это невозможно. Альтернативным решением может быть сопоставление вашего объекта с объектами передачи данных Dto (до объекта кэширования), а наоборот - при извлечении.

Другие темы по этой теме (связанные с WCF, но по-прежнему включает в себя сериализации IdentityUser):

asp-net-mvc-5-identityuser-in-wcf

how-do-i-serialize-an-identityuser-reference-in-web-api-2-2

Смежные вопросы