我知道如果我的类用 DataContract 属性修饰,我可以省略具有 JsonIgnore 属性或 IgnoreDataMember 的属性。特别是我使用后一种方法,但我在json中看到了属性。
我的错误是什么?
我的课程:
[DataContract(Name="Activity")]
public class ActivityDTO
{
[DataMember(Name = "id")]
public int Id { get; set; }
[DataMember(Name="usercode")]
[IgnoreDataMember]
public string UserCode { get; set; }
[DataMember(Name = "value")]
public string Value { get; set; }
}
和Json
{
"id": 5,
"usercode": "user",
"value": "100"
}
我希望在反序列化中使用 usercode ,而不是在序列化中看到它
答案 0 :(得分:1)
答案在article。
IgnoreDataMemberAttribute属性仅在与未标记类型一起使用时受到尊重。这包括未使用DataContractAttribute,SerializableAttribute,CollectionDataContractAttribute或EnumMemberAttribute属性之一标记的类型,或通过任何其他方式(例如IXmlSerializable)标记为可序列化的类型。
在您的情况下,要省略UserCode属性 - 只是不要标记任何序列化属性:
[DataContract(Name="Activity")]
public class ActivityDTO
{
[DataMember(Name = "id")]
public int Id { get; set; }
public string UserCode { get; set; }
}
<强>加了:强> 由于您希望反序列化与序列化的行为不同,我看到了两种实现此目的的方法:
a)此处描述:How can I prevent a datamember from being serialized 缺点是它不是线程安全的。
[DataContract( Name = "Activity" )]
public class ActivityDTO
{
private string _userCode;
[DataMember( Name = "id" )]
public int Id { get; set; }
[DataMember( Name = "usercode" , EmitDefaultValue = false )]
public string UserCode { get; set; }
[DataMember( Name = "value" )]
public string Value { get; set; }
[OnSerializing]
private void OnSerializing( StreamingContext context )
{
_userCode = UserCode;
UserCode = default( string );
}
[OnSerialized]
private void OnSerialized( StreamingContext context )
{
UserCode = _userCode;
}
}
b)你可以一直定制并实现ISerializable:
[Serializable]
public class ActivityDTO : ISerializable
{
public int Id { get; set; }
public string UserCode { get; set; }
public string Value { get; set; }
public ActivityDTO()
{
}
public ActivityDTO( SerializationInfo info , StreamingContext context )
{
Id = info.GetInt32( "id" );
UserCode = info.GetString( "usercode" );
Value = info.GetString( "value" );
}
public void GetObjectData( SerializationInfo info , StreamingContext context )
{
info.AddValue( "id" , Id );
info.AddValue( "value" , Value );
}
}