在序列化ASP.NET WEB API中省略一个属性

时间:2014-04-03 16:15:15

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

我知道如果我的类用 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 ,而不是在序列化中看到它

1 个答案:

答案 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 );
    }
}