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

时间:2013-09-24 17:45:32

标签: c# .net wcf linq-to-sql

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

2 个答案:

答案 0 :(得分:2)

我使用https进行加密,主要是因为只是在访问服务时,您默认强制执行加密,这样可以节省客户端代码。你有几个可能的答案:

  1. 从WCF端返回用户对象时删除密码。 (您可以更改对象密码的值,而不是保存更改..然后将对象返回给客户端)
  2. 使用自定义对象作为登录响应,仅返回客户端的必要信息。
  3. 使用像AutoMapper这样的nuget包实现数据传输对象模式。
  4. 如果您没有腌制和散列密码,请考虑一下。

答案 1 :(得分:0)

如果我从不想要序列化对象,最好挂钩OnSerializing事件。由于我使用的是Linq-To-Sql,我的DataContext的designer.cs已经捕获了OnSerializing事件,用于跟踪lazing加载实体引用的序列化状态。添加用[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对象进行交互,密码都不会根据需要传递给客户端。