【问题标题】:Ignore Non Serialized property in BinaryFormatter Serialization忽略 BinaryFormatter 序列化中的非序列化属性
【发布时间】:2016-02-03 01:30:51
【问题描述】:

我有一个名为User 的类,它是[Serializable],继承自基类IdentityUser 一个实体框架类和不可序列化。

我在Booking 类中有一个属性,类型为UserBooking 类是Serializable 我正在尝试使用BinaryFormatter 序列化预订对象,但我不能因为IdentityUser 类和我收到此错误:

'键入'Microsoft.AspNet.Identity.EntityFramework.IdentityUser' 程序集'Microsoft.AspNet.Identity.EntityFramework,版本=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' 未标记为 可序列化。'

有没有办法忽略这个属性,因为我认为没有办法将“IdentityUser”设置为可序列化。

[Serializable]
public class User : IdentityUser
{
   public String FirstName { get; set; }
}

[Serializable]
public class Booking
{
   [ForeignKey("Guest")]
   public string GuestId { set; get; }
   public virtual User Guest { set; get; }
}

【问题讨论】:

    标签: c# asp.net-mvc entity-framework serialization


    【解决方案1】:

    BinaryFormatter 序列化对象的public and private fields——而不是属性。对于auto-implemented property,秘密支持字段是实际序列化的内容。

    通常,如果您不希望某个字段被序列化,您可以应用[NonSerialized] 属性,BinaryFormatter 将跳过它。在 c# 7.3 及更高版本中,可以通过使用以字段为目标的属性对自动实现的属性的秘密支持字段执行此操作:

        [field: NonSerialized]
        public virtual User Guest { set; get; }
    

    请参阅:Auto-Implemented Property Field-Targeted AttributesWhat's new in C# 7.3

    在 c# 7.3 之前,无法将属性应用于自动实现属性的支持字段。因此,您需要明确支持字段:

    [Serializable]
    public class Booking
    {
        [ForeignKey("Guest")]
        public string GuestId { set; get; }
    
        [NonSerialized]
        User guest;
    
        public virtual User Guest { set { guest = value; } get { return guest; } }
    }
    

    顺便说一句,如果你需要序列化User中的一些信息,你可以考虑实现ISerializable,或者用serialization surrogates替换User的实例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-27
      • 2014-05-21
      • 1970-01-01
      • 2013-04-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多