有选择地序列化和反序列化

本文关键字:反序列化 序列化 选择地 | 更新日期: 2023-09-27 18:32:42

我的Linq-To-Sql映射中有一个User对象。上面有一个密码属性,我想在用户提交时(例如,在登录期间)反序列化。但是,我永远不想将此属性传回给用户,因为它将包含实际密码的加密版本,并且我宁愿不公开有关密码或加密方法的任何信息。有没有办法在对象范围内告诉 Linq-To-Sql 在返回 User 对象时永远不要传递 Password 属性?

有选择地序列化和反序列化

我使用 https 进行加密,主要是因为在访问服务时,默认情况下会强制执行加密,从而节省客户端代码。 不过,您有几个可能的答案:

  1. 从 WCF 端返回用户对象时清空密码。(你可以更改对象的密码值,只是不保存更改..然后将对象返回给客户端)
  2. 对仅返回客户端必要信息的登录响应使用自定义对象。
  3. 使用像自动映射器这样的 nuget 包实现数据传输对象模式。

如果您没有对密码进行加盐和散列,请考虑一下。

在我从不想序列化对象的情况下,最好挂接到 OnSerializing 事件。由于我使用的是 Linq-To-Sql,因此 DataContext 的设计器已经捕获了 OnSerializing 事件.cs用于跟踪延迟加载实体引用的序列化状态。添加另一个用[OnSerializing]修饰的函数会在System.ServiceModel.Activation中抛出错误,所以我不得不找到另一条路由。这是我的解决方案:

修改 DataContext.designer.cs

在DataContext.designer.cs中,我添加了

[global::System.Runtime.Serialization.OnSerializingAttribute()]
[global::System.ComponentModel.EditorBrowsableAttribute(EditorBrowsableState.Never)]
public void OnSerializing(StreamingContext context)
{
    this.serializing = true;
    // custom function to handle my logic
    this.ClearPassword();
}

将方法添加到我的自定义类定义

在我的 User.cs 文件中,我有一个分部类定义。因此,我需要做的就是将 ClearPassword 方法添加到我的分部类定义中:

partial class User
{
    private void ClearPassword()
    {
        this.Password = null;
    }
    //* OTHER CODE *//
}

现在,无论我如何与 User 对象交互,密码都不会根据需要传递给客户端。