【问题标题】:Make a property deserializable but not serializable使属性可反序列化但不可序列化
【发布时间】:2014-05-16 16:23:00
【问题描述】:

我有一个带有属性的类,我想在 json 反序列化中使用,但我想在 json 序列化中省略。

示例: 我有一个班级用户:

public class UserDTO
    {
        public string UserName { get; set; }
        public string Password { get; set; }

    }

我在 ASP.NET Web API 中使用它。

我使用这个类来登录和获取所有用户。 显然,在获取时我只想看到用户名,但在登录时我需要用户名和密码。

我已经尝试使用属性[IgnoreDataMember]

public class UserDTO
{
   public string UserName { get; set; }
   [IgnoreDataMember]
   public string Password { get; set; }

}

或者用 DataContract 装饰我的班级

[DataContract]
public class UserDTO
    {
       [DataMember]
       public string UserName { get; set; }

       public string Password { get; set; }

    }

但在这种模式下我无法登录,确实如果我不使用属性 [DataContract][IgnoreDataMember] 我可以使用登录,但在获取我看到密码了。

我也尝试使用支持字段 [NotSerialized],例如建议 here,但我得到了相同的结果。

【问题讨论】:

  • 哪个序列化程序?这很重要。
  • 你如何反序列化你从未序列化的属性?根据定义,您不能对不存在的属性进行操作!另外,如果这种行为是出于安全考虑,那么为什么要使用字符串?我不明白的主要事情是实际上是什么问题?如果您不在传输时序列化密码,那么根据定义,接收器将不会获得密码。因此,您的代码在技术上按预期工作。那么问题不是保留密码还是保留密码?在我看来,您需要创建一个 credentialDTO 来保存用户和密码以保持两个实体分开。

标签: asp.net .net json serialization asp.net-web-api


【解决方案1】:

根据序列化程序,您可能可以简单地添加:

public bool ShouldSerializePassword() { return false; }

这是一种众所周知的模式,适用于许多序列化程序,但不是全部。

另一种常见的模式是:

public bool PasswordSpecified { get { return false; } set {} }

但这更棘手,因为您需要告诉序列化程序忽略它 - 例如[XmlIgnore, ScriptIgnore, IgnoreDataMember]等。

无论哪种方式,您可能都想添加:

[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]

(防止属性或方法出现在太多地方)

最后一个选择很简单:在序列化时,不要给.Password 一个值;p

【讨论】:

    猜你喜欢
    • 2020-06-08
    • 2011-04-17
    • 2022-01-18
    • 2021-05-26
    • 1970-01-01
    • 1970-01-01
    • 2013-05-23
    • 2021-05-22
    相关资源
    最近更新 更多