Asp.net 使属性可反序列化但不可序列化

Asp.net 使属性可反序列化但不可序列化,asp.net,.net,json,serialization,asp.net-web-api,Asp.net,.net,Json,Serialization,Asp.net Web Api,我有一个带有属性的类,我想在json反序列化中使用它,但我想在json序列化中忽略它 例如: 我有一个类用户: public class UserDTO { public string UserName { get; set; } public string Password { get; set; } } 我在ASP.NETWebAPI中使用它 我使用这个类来登录和获取所有用户。 显然,在get中我只想看到用户名,但在登录中我需要用户名和密码

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

例如: 我有一个类用户:

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

    }
我在ASP.NETWebAPI中使用它

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

我已尝试使用属性[IgnoreDataMember]

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

}
或者用数据合同装饰我的课堂

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

       public string Password { get; set; }

    }
但在此模式下,我无法登录,事实上,如果我不使用属性[DataContract][IgnoreDataMember]我可以使用登录,但在get中我可以看到密码


我还尝试使用支持字段[NotSerialized],如suggest,但我得到了相同的结果。

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

public bool ShouldSerializePassword() { return false; }
这是一个众所周知的模式,可以在许多序列化程序上工作,但并非所有序列化程序都可以

另一种常见模式是:

public bool PasswordSpecified { get { return false; } set {} }
但这更为棘手,因为您还需要告诉序列化程序忽略它—例如使用
[XmlIgnore,ScriptIgnore,IgnoreDataMember]

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

[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
(防止属性或方法出现在过多的地方)


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

哪个序列化程序?这很重要。你怎么能反序列化你从未序列化过的属性?根据定义,您不能对不存在的属性进行操作!另外,如果这种行为是为了安全,那么为什么要使用字符串呢?我不明白的主要问题是到底是什么?如果在传输时不序列化密码,那么根据定义,接收方将无法获得密码。因此,您的代码在技术上是按预期工作的。那么,问题是不是不保留密码还是保留密码?在我看来,您需要创建一个拥有用户和密码的CredentialTo,以便将这两个实体分开。