Asp.net 使属性可反序列化但不可序列化
我有一个带有属性的类,我想在json反序列化中使用它,但我想在json序列化中忽略它 例如: 我有一个类用户: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中我只想看到用户名,但在登录中我需要用户名和密码
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,以便将这两个实体分开。