为何以及何时使用NonSerializable属性?

时间:2015-07-02 19:53:26

标签: c# serialization

我最近在学习C#序列化。我注意到[NonSerializable]属性,并想知道为什么它应该/可以/必须使用以及原因是什么。

以下是我使用过的一些研究网站:

实际问题:

  • 是否存在严重无法序列化(理论和实践)的例子?

  • 为什么要使用它?

2 个答案:

答案 0 :(得分:2)

我可以想到为什么不序列化某些字段的几个原因,例如:

    - 它们包含未加密的易受攻击的数据,如密码,密码等,
    - 它们用于存储未压缩的数据(例如位图),并且包含可用的压缩等效项的字段,
    - 它们是在对象构造函数中创建的(例如,计时器)。

答案 1 :(得分:2)

如果我利用属性来阻止序列化,那通常是因为我想要保护数据,或者因为序列化给定字段(可能是一个本身不可序列化的字段,或者每个都被初始化的字段)都没有意义该类被实例化的时间。)

例如,假设我有一个我想保存的与用户关联的记录。我可能想保存他们的名字,但从不保存他们的密码:

[Serializable]
public struct User
{
    public string Name;
    //this should never be persisted
    [NonSerialized]
    public string Password;
}

//when I persist this, it persists the CreatedBy User without the password
[Serializable]
public class Record
{
    //password won't be persisted now
    public User CreatedBy{ get; set; }

    //other information I want to save
}

其他时候,我可能有一个不可序列化的属性,我不想保存或在序列化后通过线路发送。

[Serializable]
public class Whatever
{
     public Whatever()
     {
         //this always gets new-ed up, so there's no point in persisting it.
         //maybe it's not even serializable!
         HelperUtility = InitHelper();
     }

     //no sense in serializing this helper utility
     [NonSerialized]
     public NonSerializableClass HelperUtility;

     //but I may want to actually save this!
     public string DataIActuallyWantToSave;
}

这就是要点。

这些属性实际上确实在现实世界中使用,我已多次使用它们。