Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 选择性地序列化和反序列化_C#_.net_Wcf_Linq To Sql - Fatal编程技术网

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

C# 选择性地序列化和反序列化,c#,.net,wcf,linq-to-sql,C#,.net,Wcf,Linq To Sql,我的Linq到Sql映射中有一个用户对象。在它上面有一个密码属性,我想在用户提交时反序列化它——例如,在登录期间。不过,我永远不想将此属性传递回用户,因为它将包含实际密码的加密版本,并且我不想公开有关密码或加密方法的任何信息。是否有一种方法可以在对象范围内告诉Linq to Sql在返回用户对象时永远不要传递密码属性?我使用https进行加密,主要是因为在访问服务时,默认情况下您会强制加密,从而保存客户端代码。不过,您有一些可能的答案: 从WCF端返回用户对象时,请清空密码。(您可以更改对象密码

我的Linq到Sql映射中有一个用户对象。在它上面有一个密码属性,我想在用户提交时反序列化它——例如,在登录期间。不过,我永远不想将此属性传递回用户,因为它将包含实际密码的加密版本,并且我不想公开有关密码或加密方法的任何信息。是否有一种方法可以在对象范围内告诉Linq to Sql在返回用户对象时永远不要传递密码属性?

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

  • 从WCF端返回用户对象时,请清空密码。(您可以更改对象密码的值,但不保存更改。。然后将对象返回到客户端)
  • 为您的登录响应使用自定义对象,该对象仅返回客户端所需的信息
  • 使用类似AutoMapper的nuget包实现数据传输对象模式

  • 如果您没有对您的密码进行腌制和散列,请您考虑。p> 在我从不想序列化对象的情况下,最好钩住onserialization事件。由于我使用Linq To Sql,我的DataContext的designer.cs已经捕获了OnSerialization事件,用于跟踪延迟加载实体引用的序列化状态。添加另一个用

    [onserialization]
    修饰的函数会在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 *//
    }
    

    现在,无论我如何与用户对象交互,密码永远不会按需要传递给客户端。

    你能展示一些代码吗?我真的不知道该发布什么,因为它在linq to sql框架中,我并不特别喜欢这些答案,因为它们是更多的解决方法,但它们非常有效。另外,盐/杂碎+1。我使用的是NuGet的BCrypt.Net。数据传输对象是一种设计模式。设计模式不是解决方案。如果您主要是将数据库对象传递给客户端。。您应该看看WCF数据服务(OData)。我仍然会对您的登录方法使用自定义对象响应。这就是数据契约的用途。