忽略BinaryFormatter序列化中的非序列化属性

时间:2015-11-03 01:24:01

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

我有一个名为User的类,它是[Serializable],并且从基类IdentityUser继承了一个Entity Framework类和Non Serializable。

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

  

'输入'Microsoft.AspNet.Identity.EntityFramework.IdentityUser'进入   程序集'Microsoft.AspNet.Identity.EntityFramework,Version = 2.0.0.0,   Culture = neutral,PublicKeyToken = 31bf3856ad364e35'未标记为   序列化'。

有没有办法忽略这个属性,因为我认为没有把'IdentityUser'作为Serializable。

[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; }
}

1 个答案:

答案 0 :(得分:10)

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,或用{{替换User的实例3}}