我有一个名为User
的类,它是[Serializable]
,并且从基类IdentityUser
继承了一个Entity Framework类和Non Serializable。
我在Booking
类中有一个属性,类型为User
,Booking
类为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; }
}
答案 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 Attributes和What'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}}